2017-10-13 30 views
1

メインフレームにいくつかのサブパネルがあるwxアプリケーションがあります。メインフレームにはメニューバーがあり、メニューのそれぞれはパネルに関連付けられています。つまり、メニュー項目の作成とイベントハンドラへのバインディングは、メインフレームではなく個々のパネルで行う必要があります。ここでは、最小限の例です:wxPython:サブパネルのメニューを作成する

import wx 


class myPanel1(wx.Panel): 
    def __init__(self, parent, menubar): 
     super().__init__(parent=parent) 

     menu = wx.Menu() 
     menuAction1 = menu.Append(wx.ID_ANY, 'Action1') 
     menuAction2 = menu.Append(wx.ID_ANY, 'Action2') 

     menubar.Append(menu, '&Actions') 

     # This does not work because the EVT_MENU is only seen by the main frame(?) 
     self.Bind(wx.EVT_MENU, self.onAction1, menuAction1) 
     self.Bind(wx.EVT_MENU, self.onAction2, menuAction2) 

    def onAction1(self, event): 
     print('Hello1') 

    def onAction2(self, event): 
     print('Hello2') 


class mainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

     self.menubar = wx.MenuBar() 
     # There are more panels in my actual program 
     self.panel1 = myPanel1(self, self.menubar) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(self.panel1, flag=wx.EXPAND, proportion=1) 
     self.SetSizerAndFit(sizer) 

     self.SetMenuBar(self.menubar) 
     self.Layout() 


class myApp(wx.App): 
    def OnInit(self): 
     frame = mainWindow(parent=None, title='Title') 
     self.SetTopWindow(frame) 
     frame.Show() 
     return True 


if __name__ == '__main__': 
    app = myApp() 
    app.MainLoop() 

問題は、メインフレームからメニューイベントがサブパネルに伝播しないのでmyPanel1.onAction1が呼び出されないことになりました。 これを行うためのすてきな方法はありますか?

答えて

1

一方、私は自分自身で答えを見つけました。それは、彼らの努力のため、この質問について考えた皆のおかげでとにかく

self.GetParent().Bind(wx.EVT_MENU, self.onAction1, menuAction1) 

myPanel1.__init__

self.Bind(wx.EVT_MENU, self.onAction1, menuAction1) 

を変えるのと同じくらい簡単です。

関連する問題