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 :

attendre un wx.EVT_BUTTON


Sujet :

wxPython

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut attendre un wx.EVT_BUTTON
    Bonjour,

    j'aurai voulu que mon programme s'arrête tant que l'utilisateur n'a pas appuyer sur un des boutons voulu.

    j'ai par exemple 2 boutons pour un choix entre Passe et Petite du joueur qui génère lors de l'appuie un évènement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            self.Bind(wx.EVT_BUTTON, self.Passe, self.btPasse)
            self.Bind(wx.EVT_BUTTON, self.Petite, self.btPetite)
     
        def Passe(self, event):
            global choix_joueur
            global enchere_actuelle
            enchere_actuelle = 0
            choix_joueur = True
     
        def Petite(self, event):
            global choix_joueur
            global enchere_actuelle
            enchere_actuelle = 1
            choix_joueur = True
    Dans mon programme j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            def joueur_enchere(enchere_actuelle):
                    global choix_joueur                
                    while choix_joueur != True : # boucle attendant le choix du joueur par un évènement bouton
                    a= self.refresh()
                puis suite du prgm...
    le problème c'est que ma boucle while qui est censée attendre le choix du joueur par action d'un des boutons avant de continuer le programme bloque l'affichage de la fenêtre et la lecture des boutons ! j'ai essayé de rafraichir la fenêtre en mettant un refresh mais rien n'y fait !

    François

  2. #2
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Pour rendre la main à l'IHM, il fallait jusqu'alors utiliser la fonction Yield(). Mais cette fonction est obsolète et va disparaitre des version futures.

    Pour que le code reste pérenne il faut utiliser la méthode wx.App.Yield() qui comme son nom l'indique est une méthode de la classe wx.App.

    Ci-dessous un petite exemple:
    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
    #! /usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import wx
     
    class MaFenetre(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, parent = None, title = u"exemple de Yield()")
            self.choix = None
            sizer0 = wx.BoxSizer(wx.VERTICAL)
            self.sizer1 = wx.BoxSizer(wx.HORIZONTAL)
            sizer2 = wx.BoxSizer(wx.HORIZONTAL)
            self.panel = wx.Panel(self, id = -1)
            self.label = wx.StaticText(self.panel, -1,
                                       u"Cliquer sur commencer...")
            self.sizer1.Add(self.label, 0, wx.ALL|wx.EXPAND, 10)
            self.btPasse = wx.Button(self.panel, -1, u"Je passe")
            self.btPetite = wx.Button(self.panel, -1, u"Petite!")
            self.btCommencer = wx.Button(self.panel, -1, u"Commencer")
            sizer2.Add(self.btCommencer, 1, wx.ALL, 3)
            sizer2.Add(self.btPasse, 1, wx.ALL, 3)
            sizer2.Add(self.btPetite, 1, wx.ALL, 3)
            sizer0.Add(self.sizer1, 1, wx.ALL|wx.EXPAND, 5)
            sizer0.Add(sizer2, 0, wx.ALL|wx.EXPAND, 5)
            self.panel.SetSizer(sizer0)
            self.panel.Fit()
            self.Fit()
            self.btPasse.Enable(False)
            self.btPetite.Enable(False)
     
            self.Bind(wx.EVT_BUTTON, self.OnPasse, self.btPasse)
            self.Bind(wx.EVT_BUTTON, self.OnPetite, self.btPetite)
            self.Bind(wx.EVT_BUTTON, self.OnCommencer, self.btCommencer)
     
        def OnPasse(self, event):
            self.choix = "Passe"
     
        def OnPetite(self, event):
            self.choix = "Petite"
     
        def OnCommencer(self, event):
            self.btCommencer.Enable(False)
            self.label.SetLabel(u"en attente d'un choix...")
            self.btPasse.Enable(True)
            self.btPetite.Enable(True)
            while not self.choix:
                app.Yield()
            self.btPasse.Enable(False)
            self.btPetite.Enable(False)
            if self.choix == "Passe":
                self.label.SetLabel(u"le joueur a passé...")
            else:
                self.label.SetLabel(u"le joueur a déclaré une petite...")
            self.choix = None
            self.btCommencer.Enable(True)
     
    class MonApp(wx.App):
        def OnInit(self):
            fen = MaFenetre()
            fen.Show()
            self.SetTopWindow(fen)
            return True
     
    app = MonApp()
    app.MainLoop()

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    Merci Alain, trop fort

    C'est exactement ce que je cherchais. J'avais parcouru le forum sans trouver de réponse. Même dans mon livre wxPython in action je n'avais rien vu. En fait après ta réponse, je suis retourné voir. J'avais loupé une petite ligne où c'était mentionné page 77...Et encore, c'était juste Yield() ! Grâce à tes lumières , je vais pouvoir poursuivre.

    Merci encore Alain,

    François

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    Hello,

    cela marche bien pour attendre l'évènement

    while (condition attendue sur le bouton):
    app.Yield()
    suite du code...
    par contre, une fois la condition remplie pour sortir de l'attente, ma fenêtre ne répond plus à la fermeture par la croix en haut à droite dans le reste du programme. Je ne comprends pas pourquoi ?
    Serait il possible de remplacer app.Yield() par un thread ?

    François

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut Au secours
    J'ai oublié de préciser un point important cela marche parfaitement sous Linux, je ferme la fenêtre sans pb en cours de partie. C'est sous win XP qu'il ne veut rien entendre Pourquoi ?

    François

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut,

    Pourquoi ne pas désactiver tous tes widgets à l'exception des boutons qui doivent être appuyés?
    Cela te permet ainsi d' aider l'utilisateur, en restreignant et en guidant visuellement ses choix.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    hello,
    en fait je veux juste simplement que la croix et l'option dans le menu quitter marche. Avec tout le reste, cela marche Le programme se déroule bien de même que les lectures des évènements. Il n'y a que cette satanée fermeture de fenêtre qui ne fonctionne pas sous windows uniquement. Le pire, c'est que si j'ajoute un print pour faire apparaitre une fenêtre texte dans l'évènement du menu quitter avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def OnQuitter(self, event):
            print 'marche pô'
            self.Close()
    bah il me la ferme ma fenêtre du programme mais par contre plus moyen de fermer la fenêtre de texte crée à part un massif ctrl-alt-sup !
    Pige pas...
    François

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut verre à moitié plein = verre à moitié vide
    bon, j'ai résolu le problème a moitié en lisant le forum et en appliquant une réponse d'Alain 72 soit un truc de destruction massif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def OnQuitter(self, event):
            import os,sys
            os._exit(-1)
            os.abort()
            sys.exit(99)
    pourquoi résolu a moitié ? parce que du coup dans le menu déroulant l'option quitter marche bien mais ma petite croix de fermeture en haut à droite de ma fenêtre elle ne marche toujours pas
    François

  9. #9
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    En utilisant self.Destroy() au lieu de self.Close() ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    j'ai essayé, marche pô non plus. Mais bon, faute de mieux, j'ai inactivé la croix de la fenêtre par un ajout de :
    | wx.CLOSE_BOX

    François

  11. #11
    Membre expérimenté
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Par défaut
    Citation Envoyé par vega95 Voir le message
    j'ai essayé, marche pô non plus. Mais bon, faute de mieux, j'ai inactivé la croix de la fenêtre par un ajout de :
    | wx.CLOSE_BOX

    François
    ça doit venir de ton code...
    Es-tu sûr que tu détruits bien tes boites de dialogue modales après utilisation ?
    Ton programme est-il dans une boucle au moment de la fermeture ?

    Sans voir ton code, on ne peut pas t'apporter de solution.

    A noter que pour que l'appui sur la croix de fermeture pointe sur ta méthode OnQuitter, tu dois faire un Bind sur wx.EVT_CLOSE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.Bind(wx.EVT_CLOSE, self.OnQuitter)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut
    Effectivement, j'ai cherché et je n'ai pas trouvé la ligne :

    self.Bind(wx.EVT_CLOSE, self.OnQuitter)

    Une fois rajoutée, cela marche
    Merci Alain trop fort

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

Discussions similaires

  1. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 04h12
  2. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 16h35
  3. Réponses: 3
    Dernier message: 25/11/2002, 14h15
  4. Réponses: 1
    Dernier message: 14/11/2002, 00h09
  5. [VB6] attendre un événement pour continuer l'exécution
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 12/11/2002, 13h08

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