IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

Toolbar perso et EVT_MENU


Sujet :

wxPython

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Toolbar perso et EVT_MENU
    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.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,
    J'ai finalement trouvé quelque chose qui fonctionne. wx.MenuEvent n'est apparemment pas la bonne méthode (c'est dit dans le tuto sur wxwidget ici-même, mais sans plus de précision).
    Donc la soluce, il faut créer un événement de type Command avec le type wx.wxEVT_COMMAND_MENU_SELECTED :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def OnToolClick(self, event):
            #self.GetParent().Notify(u'OnToolClick \n\n id = ' + str(event.GetId()))
            evt = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, event.GetId())
            self.GetParent().GetEventHandler().ProcessEvent(evt)
    Voila, pas si compliqué finalement :p
    J.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. OpenOffice Toolbar Perso
    Par yoyo44 dans le forum C#
    Réponses: 2
    Dernier message: 23/02/2007, 15h35
  2. [SYBASE] A titre perso !
    Par Zeo_BO dans le forum Sybase
    Réponses: 13
    Dernier message: 10/04/2003, 12h32
  3. [VB6] Afficher le ToolTipText d'un controle perso
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 14/12/2002, 15h52
  4. Réponses: 4
    Dernier message: 07/12/2002, 15h24
  5. D6 Perso et Gen d'état
    Par diam's dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 02/12/2002, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo