wxPython - 如何从事件中获取MenuItem?
问题描述:
使用wxPython,我有一个菜单和状态栏的框架设置。菜单是从一个缩进的文本文件生成的,我用它来创建一个不错的嵌套菜单栏,每个菜单项绑定到一个特定的功能。我有一个“切换状态栏”菜单检查项绑定OnToggleStatusBar()。wxPython - 如何从事件中获取MenuItem?
我想看看菜单项是否被选中并作出相应的反应,但我似乎无法从事件中访问menuItem。如果我使用GetId(),那么如何才能找到菜单项?我用FindWindowById()尝试了event.GetId(),但什么都没有。我也试过event.GetEventObject(),它返回一个菜单,但不是一个菜单项。
def OnToggleStatusBar(self, event):
id = event.GetId()
menu = event.GetEventObject()
menuItem = menu.FindWindowById(id) #does not work
print self.FindByWindowId(id) # prints None
答
你并不需要直接找到该项目,则可以使用wxMenuBar::IsChecked()
,这会为你做它。您可以将菜单栏存储在self.menuBar
中,或者使用其GetMenuBar()
方法从框架中检索它。
答
这有点复杂,但不是太糟糕。基本上你需要使用菜单的FindItem
方法,它采用菜单项的字符串名称。这会返回它的ID,然后你可以使用菜单的FindItemById
方法。这里有一个快速和肮脏的例子:
import wx
########################################################################
class MyForm(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="wx.Menu Tutorial")
self.panel = wx.Panel(self, wx.ID_ANY)
# Create menu bar
menuBar = wx.MenuBar()
# create check menu
checkMenu = wx.Menu()
wgItem = checkMenu.Append(wx.NewId(), "Wells Fargo", "", wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.onFargo, wgItem)
citiItem = checkMenu.Append(wx.NewId(), "Citibank", "", wx.ITEM_CHECK)
geItem = checkMenu.Append(wx.NewId(), "GE Money Bank", "", wx.ITEM_CHECK)
menuBar.Append(checkMenu, "&Check")
# Attach menu bar to frame
self.SetMenuBar(menuBar)
#----------------------------------------------------------------------
def onFargo(self, event):
""""""
menu = event.GetEventObject()
item_id = menu.FindItem("Wells Fargo")
item = menu.FindItemById(item_id)
print item.IsChecked()
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()
答
使用该事件来访问您想要的数据。
print event.Id
print event.Selection # returns 1 if checked 0 if not checked
print event.IsChecked() # returns True if checked False if not checked
打印出所有与属性:
print dir(event)
这正是我需要的东西 – Shatnerz
将这项工作,如果我有一个是可检查的多个项目?我认为你需要一种方法来区分这种情况下的物品 –
即使有多个物品,他们都必须有唯一的ID,那么为什么会出现问题呢? –