wxPython - 如何从事件中获取 MenuItem?

wxPython - How to get MenuItem from event?

使用 wxPython,我有一个带有菜单和状态栏的框架设置。菜单是从一个缩进的文本文件生成的,我用它来创建一个漂亮的嵌套菜单栏,每个菜单项都绑定到一个特定的功能。我有一个 "Toggle Status Bar" 菜单检查项,它绑定了 OnToggleStatusBar()。

我想查看菜单项是否被选中并做出相应反应,但我似乎无法从事件中访问 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

有点复杂,但还算不错。基本上您需要使用菜单的 FindItem 方法,该方法采用菜单项的字符串名称。这个 returns 它的 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()

您不需要查找该项目,您可以使用 wxMenuBar::IsChecked(),它将直接为您完成。您可以只将菜单栏存储在 self.menuBar 中,也可以使用其 GetMenuBar() 方法从框架中检索它。

使用事件访问您想要的数据。

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)