将事件绑定到wx.Menu()而不是绑定到wxPython中的菜单项

时间:2009-07-27 23:39:47

标签: python wxpython

可以使用以下代码轻松定义我的问题:

self.Bind(wx.EVT_MENU_OPEN, self.OnAbout)

这意味着当我点击MenuBar中的任何wx.Menu()时,会调用函数'onAbout()'。如何将此事件绑定到名为wx.MenuAbout()的特定wx.Menu()?

如果您感觉更有帮助,也许您可​​以向我提供事件处理程序文档的链接。我可以找到事件处理函数的文档,但不能找到实际的事件处理程序(例如wx.EVT_MENU)。

类似的问题,但我不打算将一系列wx.Menu()绑定到事件:Is it possible to bind an event against a menu instead of a menu item in wxPython?

编辑:理想情况下,这是我希望能够做到的:

menuAbout = wx.Menu()
self.Bind(wx.EVT_MENU, self.OnAbout, id=menuAbout.GetId())

结果是.menuBar()中的任何其他项目(例如:文件,编辑,工具)都像普通菜单一样工作,但“关于”就像一个可点击的链接。

使用wx.EVT_MENU_OPEN意味着可以打开文件菜单,然后当鼠标悬停在'about'上时,会调用self.OnAbout函数,我只会在用户单击“关于”时发生什么菜单。

2 个答案:

答案 0 :(得分:5)

为什么不使用EVT_MENU来绑定菜单项?

任何菜单打开后,

EVT_MENU_OPEN将立即触发。话虽这么说,如果那是你真正想要的,你总是可以这样做:

您定义菜单的位置:

self.about_menu = wx.Menu()  # or whatever inherited class you have
self.Bind(wx.EVT_MENU_OPEN, self.on_menu_open)

然后你的回调:

def on_menu_open(self, event):
    if event.GetMenu()==self.about_menu:
         #do something

答案 1 :(得分:0)

这对我有用:

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "my frame")

        #give the Frame a menu bar
        self.frame_menubar = wx.MenuBar()

        fileMenu = wx.Menu()
        self.frame_menubar.Append(fileMenu, "File")

        self.rotMenu = wx.Menu()
        self.frame_menubar.Append(self.rotMenu, "Rotate")

        self.SetMenuBar(self.frame_menubar)

        self.Bind(wx.EVT_MENU_OPEN, self.rot)

    def rot(self, event):
        if event.GetMenu() == self.rotMenu:
            print 'rotate clicked'