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()方法从框架中检索它。

+0

这正是我需要的东西 – Shatnerz

+0

将这项工作,如果我有一个是可检查的多个项目?我认为你需要一种方法来区分这种情况下的物品 –

+0

即使有多个物品,他们都必须有唯一的ID,那么为什么会出现问题呢? –

这有点复杂,但不是太糟糕。基本上你需要使用菜单的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)