【问题标题】:wx top level menubar event (python)wx 顶级菜单栏事件(python)
【发布时间】:2012-05-09 13:40:17
【问题描述】:

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

即带有菜单结构

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

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

【问题讨论】:

    标签: python wxpython menubar wxwidgets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 很好的解决方法,但这不是它的工作方式。请参阅我的回答,为什么这个解决方案表现不佳。您是否在使用您的环境时遇到了不同的行为?
      • @uhz 这适用于 WinXPSP3 Python3.4.2 wxPython-Phoenix dev... 它必须是 frame.Bind(wx.EVT_MENU_OPEN, frame.OnMenuOpen) 没有在 Bind( ) 称呼。直接点击菜单栏但没有菜单栏标签很重要。
      猜你喜欢
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多