wx顶级菜单栏活动(python)

时间:2012-05-09 13:40:17

标签: python wxpython menubar wxwidgets

wxPython中是否有任何方法可以在没有任何孩子的情况下捕获菜单栏上项目的点击。

即。菜单结构

  • 文件
    • 保存
    • 退出
  • 垃圾邮件

我能够捕获点击保存或退出项目的事件,但我不确定如何捕获事件以点击垃圾邮件

2 个答案:

答案 0 :(得分:0)

据我所知,文件和垃圾邮件是顶级菜单项。在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

答案 1 :(得分:0)

@uhz解决方案几乎可行,但我不推荐它。必须有一个原因,为什么不允许可点击的顶级菜单项。在我的环境下(Debian,wx 2.8),他的解决方案会产生奇怪的行为,例如通过悬停项目来触发事件。
你的usecase更像是一个工具栏,我建议你在这里使用一个。如果您不熟悉examples at zetcode(部分工具栏),我可以再建议一下。