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

1 投票
2 回答
5487 浏览
提问于 2025-04-15 13:12

我的问题可以用以下代码简单描述:

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

这段代码的意思是,当我点击菜单栏中的任何 wx.Menu() 时,都会调用 'onAbout()' 这个函数。那么,我该如何把这个事件绑定到一个特定的 wx.Menu(),也就是 wx.MenuAbout() 呢?

如果你愿意提供更多帮助,能不能给我一个关于事件处理程序的文档链接?我找到了关于事件处理函数的文档,但找不到实际的事件处理程序(比如 wx.EVT_MENU)的相关信息。

这是一个类似的问题,但我并不是想把一系列的 wx.Menu() 绑定到事件上:在 wxPython 中,是否可以将事件绑定到菜单而不是菜单项上?

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

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

这样的话,.menuBar() 中的其他项目(比如:文件、编辑、工具)都能正常工作,而 '关于' 则像一个可点击的链接。

使用 wx.EVT_MENU_OPEN 意味着可以打开文件菜单,然后当鼠标悬停在 '关于' 上时,self.OnAbout 函数会被调用,但我只希望在用户特意点击 '关于' 菜单时才触发这个函数。

2 个回答

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'
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

撰写回答