将事件绑定到wx.Menu()而不是wxPython中的菜单项
我的问题可以用以下代码简单描述:
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