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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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