【问题标题】:wxPython - How to get MenuItem from event?wxPython - 如何从事件中获取 MenuItem?
【发布时间】:2015-12-02 19:21:00
【问题描述】:

使用 wxPython,我有一个带有菜单和状态栏的框架设置。菜单是从一个缩进的文本文件中生成的,我用它来创建一个漂亮的嵌套菜单栏,每个菜单项都绑定到一个特定的功能。我有一个绑定 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

【问题讨论】:

    标签: python user-interface wxpython wxwidgets


    【解决方案1】:

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

    【讨论】:

    • 如果我有多个可检查的项目,这会起作用吗?我认为您需要一种方法来区分这种情况下的项目
    • 即使有多个item,它们都必须有唯一的ID,那为什么会有问题呢?
    【解决方案2】:

    这有点令人费解,但还不错。基本上你需要使用菜单的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()
    

    【讨论】:

      【解决方案3】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多