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 :

Bind des buttons sur Notebook


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut Bind des buttons sur Notebook
    Je suis essayer de creer une petite application. Je voudrais que le code et le gui sont separé.

    Une example:
    Main:
    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
     
    #!/usr/bin/python
     
    # main.py
     
    import gui
    import sys
     
    def Main():
    	EventHandler()
    	gui.MainFrame.app.MainLoop()
     
    def EventHandler():
    	gui.MainFrame.app.Bind(gui.wx.EVT_BUTTON, btn_ExitClick, gui.MainFrame.btn_Exit)
    	#gui.MainFrame.app.Bind(gui.wx.EVT_BUTTON, btn_ExitClick, gui.PageTwo.btn_test)
    	#gui.PageTwo.Bind(gui.wx.EVT_BUTTON, btn_ExitClick, gui.PageTwo.btn_test)	
     
    def btn_ExitClick(event):
    	sys.exit()
     
    if __name__ == '__main__':
    	Main()
    et le gui:
    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
     
    #!/usr/bin/python
     
    # gui.py
     
    import wx
     
    class PageOne(wx.Panel):
    	def __init__(self, parent):
    		wx.Panel.__init__(self, parent)
    		wx.StaticText(self, -1, "Page One", (60,60))
     
     
    class PageTwo(wx.Panel):
    	def __init__(self, parent):
    		wx.Panel.__init__(self, parent)
    		wx.StaticText(self, -1, "Page Two", (60,60))
    		btn_test = wx.Button(self, wx.ID_ANY, "Button On Page", (200,200))
     
    class MainFrame():
    	app = wx.App()
    	frame = wx.Frame(None, -1, "Blub", size=(600, 600), pos=(0,0), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
    	frame.Centre()
     
    	panel = wx.Panel(frame)
    	nb = wx.Notebook(panel, size=(500, 500))
     
    	page1 = PageOne(nb)
    	page2 = PageTwo(nb)
     
    	nb.AddPage(page1, "Test")
    	nb.AddPage(page2, "Test 2")
     
    	btn_Exit = wx.Button(panel, wx.ID_ANY, "Exit", (510,510))
     
     
    	frame.Show()
    ça marche.
    Mais; je ne sais pas comment je peux bind une button c'est placer sur un Notebook (pas de probleme quand le button est sur le form).
    J'ai essayé quelques lignes de code, mais quand je execute le programme: "AttributeError: type object 'PageTwo' has no attribute 'btn_test'"

    Donc, comment je peux bind le button 'btn_test'?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut
    Bonsoir,

    En effet, votre application comporte un léger problème.
    Lorsqu'une erreur AttributeError est levée, c'est que vous avez oublie de lier l'attribut en question a la classe parente, ou que le programme ne trouve pas lattribut (btn_test).

    Si vous voulez séparer le Main du GUI, il vous faudra simplement modifier la ligne de votre bouton test de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.btn_test = wx.Button(self, wx.ID_ANY, "Button On Page", (200,200))
    c'est a dire ajouter le mot clef "self" qui fait de "btn_test" un attribut de la classe afin de le rendre accessible en dehors de __init__. Sans lui, la variable btn_test n'existe plus lorsque le programme a terminé de traiter la fonction __init__, donc il lève une AttributeError !

    En espérant vous avoir aidé et avoir été assez clair

    Lotendan

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Par défaut
    Bonjour,

    Je suis pas expert, mais j'ai l'impression que le plus simple est de surcharger la GUI comme le suggère par exemple wxGlade.

    Bon courage.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    Merci pour les réponses !

    @Lotendan Je pense que je comprends que vous dites. Cependant, j'obtiens toujours la même erreur quand je mets 'self' avant la ligne. Savez-vous ce qui va mal ?


    @Ggamer Je ne connais pas 'wxGlade', et je préfère écrire à la main. Cependant, Je jetterais un coup d'oeil à wxglade

    Merci

    //Update: Quand j'ecris 'PageTwo.btn_test =....' ça marche

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/05/2015, 15h13
  2. [Qt Mobility] Qt Mobility 1.1.3, avec améliorations du binding Qt Quick et des performances sur Symbian
    Par johnlamericain dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 01/03/2011, 20h37
  3. Réponses: 0
    Dernier message: 11/12/2010, 12h58
  4. Réponses: 0
    Dernier message: 11/12/2010, 12h52
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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