子を使わずにメニューバーの項目のクリックをキャプチャする方法はwxPythonにありますか?
つまり、メニュー構造
- ファイル
- 保存する
- 終了する
- スパム
保存または終了アイテムをクリックするためのイベントをキャプチャすることはできますが、スパムをクリックするためのイベントをキャプチャする方法がわかりません
@uhzソリューションはほとんど機能しますが、お勧めしません。クリック可能なトップレベルのメニュー項目が許可されないのには理由があるはずです。私の環境(Debian、wx 2.8)では、彼のソリューションは、アイテムにカーソルを合わせてイベントをトリガーするなど、奇妙な動作をします。
ユースケースはツールバーのユースケースです。ここで使用することをお勧めします。もう一度、zetcode(セクションツールバー)の例に慣れていない場合は、それらの例を見てみることをお勧めします。
私が理解しているように、ファイルとスパムはトップメニュー項目です。wx.EVT_MENU_OPEN
Windowsでは、次のようなイベントの使用とフィルタリングを試すことができます。
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()
これはPython2.6およびwxPython2.9.3.1で機能します