2017-10-13 9 views
1

J'ai une application wx où le cadre principal a plusieurs sous-panneaux. Je voudrais avoir une barre de menu dans le cadre principal, où chacun des menus est associé à un panneau. Cela signifie que la création d'éléments de menu et leur liaison aux gestionnaires d'événements doivent être effectuées dans les différents panneaux et non dans le cadre principal. Voici un exemple minimal:wxPython: menu Remplir dans le sous-panneau

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() 

Le problème est maintenant que myPanel1.onAction1 n'est pas appelé parce que l'événement de menu du cadre principal ne se propage pas au panneau secondaire. Existe-t-il un moyen de le faire?

Répondre

1

En attendant, j'ai trouvé la réponse moi-même. Il est aussi simple que de changer

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

dans myPanel1.__init__ à

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

Quoi qu'il en soit, tout le monde merci qui a pensé à cette question pour leur effort.