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 :

Module menus + Fenetre principale


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Par défaut Module menus + Fenetre principale
    bonjour, je souhaiterai créer une fenêtre principale et ajouter un menubar à cette fenêtre. Pour cela j'aimerai pouvoir utiliser un module "menus" dans lequel j'y mettrais tous les menus, ainsi que les evenements et les methodes. L'idée serait d'avoir un module menu indépendant que j'utiliserai dans mes différentes applications.
    Est ce que quelqu'un pourrais m'expliquer pourquoi il ne se passe rien dans ma fenêtre principale lorsque je clic sur les boutons de mon menu. J'aimerai bien pouvoir fermer mon application, par exemple, ou voir s'afficher mon "Coucou"
    Vous trouverez, ci joints, les codes de ma fenetre principale et celui de mon module Menus. J'avoue que je suis perplexe et que je suis complétement bloqué.
    Si quelqu'un peut m'aider ...! merci d'avance.

    Module wxTempo.py
    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
     
    #!/usr/bin/python
    # -*- coding: cp1252 -*-
     
    # Importer le Toolkit wxPython
    try:
        import wx
    except ImportError:
        raise ImportError, "The wxPython module is required to run this program."
     
    # Importer les menus
    try:
        import wxMenus
    except ImportError:
        raise ImportError, "Cette application nécessite le module wxMenus."
     
     
    #-------------------------------------------------------------------------
    class wxFenetre(wx.Frame):
        """ Fenêtre principale"""
    #-------------------------------------------------------------------------
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title)
            # ----------------------------------------------------------------
            #    Initialisation du Menu fenêtre principale
            # ----------------------------------------------------------------
            MonMenuFichier  = wxMenus.MenuPrincipal(parent=self)
     
    #-------------------------------------------------------------------------
     
     
    #-------------------------------------------------------------------------
    class MonApp(wx.App):
    #-------------------------------------------------------------------------
        def OnInit(self):
            frame = wxFenetre(None,-1,u'Fenêtre avec menus')
            frame.Show(True)
            self.SetTopWindow(frame)
            return True
     
    app = MonApp()
    app.MainLoop()
    #-------------------------------------------------------------------------
    Et mon module wxMenus.py
    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
     
    #!/usr/bin/python
    # -*- coding: cp1252 -*-
     
    # Importer le Toolkit wxPython
    try:
        import wx
    except ImportError:
        raise ImportError, "The wxPython module is required to run this program."
     
     
    #-------------------------------------------------------------------------
    class MenuPrincipal(wx.MenuBar):
        """Barre de menus deroulants"""
    #-------------------------------------------------------------------------
        def __init__(self, parent):
           wx.MenuBar.__init__(self)
     
           # Prepare the menu bar
           menuBar = wx.MenuBar()
     
           # ----------------------------------------------------------------
           #    Menu Fichier
           # ----------------------------------------------------------------
           mFichier = wx.Menu()
           mFichier.Append(wx.ID_OPEN, "&Ouvrir\tCTRL+O")
           mFichier.Append(wx.ID_CLOSE, "&Fermer\tCTRL+F")
           mFichier.AppendSeparator()
           mFichier.Append(wx.ID_EXIT, "&Quitter\tCTRL+Q")
     
           # Add menu to the menu bar
           menuBar.Append(mFichier, "&Fichier")
     
     
           # ----------------------------------------------------------------
           #    Menu Partie
           # ----------------------------------------------------------------
           mPlay = wx.Menu()
           mPlay.Append(101, "&Coucou\tCTRL+C")
           # Add menu to the menu bar
           menuBar.Append(mPlay, "&Partie")
     
     
           # ----------------------------------------------------------------
           #    Lancement de la barre de menu dans fenêtre principale
           # ----------------------------------------------------------------
           parent.SetMenuBar(menuBar)
     
     
           # Menu events
           self.Bind(wx.EVT_MENU, self.CloseWindow, id=wx.ID_EXIT)
           self.Bind(wx.EVT_MENU, self.Coucou, id=101)
     
     
        # Methods
        def CloseWindow(self, event):
           self.Close()
     
        def Coucou(self, event):
           print "Coucou"

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut
    Bonsoir,

    Le problème vient simplement de ton Bindage, dans ton menu. Il ne faut pas que tu bind sur la barre de menu, mais il faut Binder sur ta frame ( parent dans ton code )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           parent.Bind(wx.EVT_MENU, self.CloseWindow, id=wx.ID_EXIT)
           parent.Bind(wx.EVT_MENU, self.Coucou, id=101)
    Par contre, ton code est bizarre. En effet, tu dit que ta classe MenuPrincipale hérite de wx.MenuBar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MenuPrincipal(wx.MenuBar):
    Mais dans ton code, tu recréer une MenuBar sur laquelle tu fais tout.
    M'est avis que tu devrais soit virer la menuBar et tout faire sur ta classe directement ( en remplacant menuBar par self ), ou alors ne fait pas hériter ta classe de MenuBar.

    Cordialement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Par défaut
    Merci de ta réponse rapide.

    En fait, j'avais identifié la premiere raison, celle du Bind avec parent... Mais rien ne se passait quand même.

    La reponse à mon problème semble venir de ta deuxième remarque (celle du MenuBar). Aprés avoir modifié selon tes conseils, tout fonctionne par miracle.

    Cela dit, j'ai encore un problème pour fermer ma fenêtre.
    Pourquoi ne se ferme t'elle pas ?
    Elle reste desesperement ouverte et s'enssuit un message d'erreur qui m'oblige à tout fermer

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Par défaut
    ta fonction d'évènement de fermeture se trouve dans ton menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def CloseWindow(self, event):
           self.Close()
    Mais le self de cette fonction renvoie sur ta MenuBar, et non pas ta fenêtre, qui elle est parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def CloseWindow(self, event):
          self.parent.Close()
    Néanmoins, pour ça, tu dois stocker parent quelque part, genre à l'init de ta menubar :
    Là ça devrais être bon.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Par défaut
    Ohouaaaarfff
    Merci beaucoup, merci pour tout
    C'était si simple que ça !!!!
    Que le chemin est long ^^

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

Discussions similaires

  1. Récupérer la fenetre principale d'un actionlistener
    Par Cyborg289 dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 22/01/2008, 15h00
  2. [MFC][Debutant] Fenetre principale
    Par BNS dans le forum MFC
    Réponses: 2
    Dernier message: 01/08/2005, 15h18
  3. Fenetre principale
    Par benoit70 dans le forum MFC
    Réponses: 3
    Dernier message: 25/04/2005, 11h10
  4. Réponses: 15
    Dernier message: 17/01/2005, 17h08
  5. [web] [Perl\Tk]Positioner la fenetre principale
    Par etranger dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 28/12/2004, 18h53

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