wxPython 中是否有任何方法可以在没有任何子项的情况下捕获对菜单栏上项目的单击。
即具有菜单结构
- 文件
- 节省
- 退出
- 垃圾邮件
我能够捕获单击保存或退出项目的事件,但不确定如何捕获单击垃圾邮件的事件
@uhz 解决方案几乎可以工作,但我不推荐它。不允许可点击的顶级菜单项一定是有原因的。在我的环境(Debian,wx 2.8)下,他的解决方案会出现奇怪的行为,比如通过悬停项目来触发事件。
你的用例更多的是工具栏之一,我建议你在这里使用一个。如果您不熟悉这些示例,我可以再建议您查看zetcode(部分工具栏)上的示例。
据我了解,文件和垃圾邮件是顶级菜单项。在 Windows 上,您可以尝试使用wx.EVT_MENU_OPEN
和过滤事件,例如:
import wx
from wx.lib.mixins.inspection import InspectionMixin
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
menuBar = wx.MenuBar()
fileMenu = wx.Menu()
fileMenu.Append(wx.ID_ANY, "Save")
fileMenu.Append(wx.ID_ANY, "Quit")
menuBar.Append(fileMenu, "File")
self.__spamMenu = wx.Menu()
menuBar.Append(self.__spamMenu, "Spam")
self.SetMenuBar(menuBar)
self.Bind(wx.EVT_MENU_OPEN, self.__onSpamOpen)
def __onSpamOpen(self, event):
if event.GetMenu() != self.__spamMenu:
return event.Skip()
print "Spam clicked"
class MyMenuApp(wx.App, InspectionMixin):
def OnInit(self):
self.Init()
frame = MyFrame(None, wx.ID_ANY, 'Frame Window Demo')
frame.Show(True)
self.SetTopWindow(frame)
return True
if __name__ == "__main__":
app = MyMenuApp(0)
app.MainLoop()
这适用于 Python 2.6 和 wxPython 2.9.3.1