Bonjour,
J'ai lu sur the wxpython tutorial (la partie qui traite du browser, en fin de page) qu'on ne pouvait pas ajouter de controles sizeables dans une wx.Toolbar. La solution de rechange : créer sa propre toolbar à partir d'un wx.Panel. Jusque là, c'est ok.
Le problème : comment gérer l'événement EVT_MENU avec cette toolbar ?
J'ai pensé intercepter le clic sur les boutons, puis créer un événement de type MENU que je tente d'intercepter depuis la frame : sans succès.
Mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
import wx
import os.path
 
ID_OPEN = wx.NewId()
 
class Toolbar(wx.Panel):
 
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize):
        wx.Panel.__init__(self, parent, id, pos, size, wx.TAB_TRAVERSAL)
        self.bxs = wx.BoxSizer(wx.HORIZONTAL)
        self.SetSizer(self.bxs)
 
    def AddControl(self, control, proportion=0):
        self.bxs.Add(control, proportion, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2)
 
    def AddSeparator(self):
        self.bxs.Add(wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_VERTICAL), 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 4)
 
    def AddSpacer(self, size=1):
        self.bxs.AddSpacer(size)
 
    def AddTool(self, id, label, bitmap):
        btn = wx.BitmapButton(self, id, bitmap, wx.DefaultPosition, wx.DefaultSize)
        self.bxs.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM, 2)
        self.Bind(wx.EVT_BUTTON, self.OnToolClick, btn)
 
    def OnToolClick(self, event):
        self.GetParent().Notify(u'OnToolClick \n\n id = ' + str(event.GetId()))
        evt = wx.MenuEvent(0, event.GetId())
        self.GetParent().GetEventHandler().ProcessEvent(evt)
 
 
class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, u'test toolbar', wx.DefaultPosition, wx.Size(640,480), wx.DEFAULT_FRAME_STYLE)
        self._CreateMenu()
        self._CreateToolBar()
        self._BindEvents()
        self._mainPanel = wx.Panel(self)
        bxs = wx.BoxSizer(wx.VERTICAL)
        bxs.Add(self._tlb, 0, wx.EXPAND)
        bxs.Add(wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0, wx.EXPAND)
        bxs.Add(self._mainPanel, 1, wx.EXPAND)
        self.SetSizer(bxs)
 
    def _BindEvents(self):
        self.Bind(wx.EVT_MENU, self.OnOpenMenu, id = ID_OPEN)
 
    def _CreateMenu(self):
        self.mnb = wx.MenuBar(0)
        mnuFile = wx.Menu()
        self.mnb.Append(mnuFile, u'File')
        mniOpen = wx.MenuItem(mnuFile, ID_OPEN, u'Open\tCtrl+O' , u'Open', wx.ITEM_NORMAL)
        mnuFile.AppendItem(mniOpen)
        self.SetMenuBar(self.mnb)
 
    def _CreateToolBar(self):
        self._tlb = Toolbar(self)
        sz = 16
        self._tlb.AddTool(ID_OPEN, u'Open', wx.Bitmap(os.path.join(u'icons', str(sz), u'open.png'), wx.BITMAP_TYPE_PNG))
        # 
        self._tlb.AddSpacer(4)
        self._cmbAdressBar = wx.ComboBox(self._tlb, wx.ID_ANY, u'', wx.DefaultPosition, wx.DefaultSize, [], wx.CB_DROPDOWN | wx.TE_PROCESS_ENTER)
        self._tlb.AddControl(self._cmbAdressBar, 1)
 
    def Notify(self, message, extrastyle=0):
        wx.MessageDialog(self, str(message), u'Notification', wx.OK | extrastyle).ShowModal()
 
    def OnOpenMenu(self, event):
        self.Notify(u'OnOpenMenu \n\n id = ' + str(event.GetId()))
 
class TheApp(wx.App):
 
    def OnInit(self):
        self._mainFrame = MainFrame()
        self._mainFrame.Show()
        self.SetTopWindow(self._mainFrame)
        return True
 
if __name__ == '__main__':
    app = TheApp(redirect = True, filename = 'stdout.log')
    app.MainLoop()
Même sans préciser l'id dans le Bind, je ne catche pas l'événement, donc il doit y avoir un souci avec la création du MenuEvent (si c'est bien un MenuEvent que je dois utiliser).

Merci
J.