wxPython如何从事件中获取MenuItem?

2024-10-03 02:38:09 发布

您现在位置:Python中文网/ 问答频道 /正文

使用XPytha菜单栏和设置框。菜单是从缩进的文本文件生成的,我用它创建一个漂亮的嵌套菜单栏,每个菜单项都绑定到一个特定的函数。我有一个“切换状态栏”菜单检查项,它绑定到了toggleStatusBar()上。在

我想看看菜单项是否被选中并做出相应的反应,但我似乎无法从事件中访问菜单项。如果我使用GetId(),如何使用它来查找菜单项?我试过了事件.GetId(),但什么也没有。我也试过了事件.GetEventObject(),它返回了一个菜单,但不是一个菜单项。在

def OnToggleStatusBar(self, event):
    id = event.GetId()
    menu = event.GetEventObject()
    menuItem = menu.FindWindowById(id) #does not work
    print self.FindByWindowId(id) # prints None

Tags: 函数selfeventid菜单事件menu菜单项
3条回答

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

打印出包含以下内容的所有属性:

^{pr2}$

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

相关问题 更多 >