2012-05-09 44 views
1

wxPython中有沒有什麼方法可以在菜單欄上的某個項目上捕獲點擊,而不需要任何childeren。wx頂級菜單欄事件(python)

I.e.與菜單結構

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

我能捕捉到事件點擊保存或退出項目,但我不能確定如何我可以捕獲點擊垃圾郵件的事件

回答

0

@uhz解決方案几乎工作,但我不會推薦它。爲什麼不允許點擊頂級菜單項目,這一定是有原因的。在我的環境下(Debian,wx 2.8),他的解決方案會產生奇怪的行爲,例如通過懸停項目來觸發事件。
你的用例更多的是一個工具欄,我建議你在這裏使用一個。如果您不熟悉它們,我可以再次建議看看examples at zetcode(部分工具欄)。

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

+0

不錯的嘗試了一種解決方法,但這不是它是如何要去工作。看到我的答案,爲什麼這個解決方案不是很好。你使用你的環境是否遇到不同的行爲? – phineas

+0

在Windows上,它的工作原理非常正確 – uhz

+0

我嘗試了這個第一次,即時在Windows上,它沒有工作。 – Hugoagogo