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 :

Problème de synchronisation avec une Gauge


Sujet :

wxPython

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Points : 36
    Points
    36
    Par défaut Problème de synchronisation avec une Gauge
    Bonjour,
    j'ai un petit soucis existentiel au sujet de l'utilisation d'une gauge avec un event "wx.EVT_TIMER".

    L'idée est la suivante :
    Lorsque je "Click" sur mon bouton, j'effectue un traitement dans ma fonction "OnClick" (simulé par ma petite temporisation) et la gauge devrait fonctionner. Cela permet de faire patienter l'utilisateur.
    Cependant, le traitement semble s'exécuter et ma gauge se déclenche après le traitement.

    Si quelqu'un peut m'expliquer ce qui se passe et comment résoudre cette affaire. Merci d'avance pour vos réponses.

    Voici un petit exemple de 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
     
    import wx
     
     
    class Bonjour(wx.Frame):
        def __init__(self, titre):
            wx.Frame.__init__(self, None,-1, title = titre, size = (450, 200))
     
            self.i = 0
            self.g = wx.Gauge(self, -1, 50, (110, 95), (250, 25))
            self.button = wx.Button(self, 10, 'Click !', (20, 20))
     
            self.Bind(wx.EVT_TIMER, self.TimerHandler)
            self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
     
        def __del__(self):
            self.timer.Stop()
     
        def TimerHandler(self, event):
            self.g.Pulse()
     
        def OnClick(self, event):
            self.timer = wx.Timer(self)
            self.timer.Start(100)
     
            ## Temporisation
            while self.i <> 9999999 :
                self.i = self.i + 1
     
     
    class MonApp(wx.App):
        def OnInit(self):
            fen = Bonjour("Exemple 1")
            fen.Show(True)
            self.SetTopWindow(fen)
            return True
     
    app = MonApp()
    app.MainLoop()

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    C'est normal, ton while est bloquant. Il bloque le mainloop.
    Si tu veux effectuer un traitement bloquant tu peux utiliser un thread:

    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
     
    import wx
    import threading
     
    class Bonjour(wx.Frame):
        def __init__(self, titre):
            wx.Frame.__init__(self, None,-1, title = titre, size = (450, 200))
     
            self.i = 0
            self.g = wx.Gauge(self, -1, 50, (110, 95), (250, 25))
            self.button = wx.Button(self, 10, 'Click !', (20, 20))
            self.timer = wx.Timer(self)
            self.Bind(wx.EVT_TIMER, self.TimerHandler)
            self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
     
        def TimerHandler(self, event):
            self.g.Pulse()
     
        def OnClick(self, event):
            self.timer.Start(100)
            thread = threading.Thread(target=self.threadTraitement)
            thread.start()
     
        def threadTraitement(self):
            while self.i <> 9999999 :
                self.i = self.i + 1
            self.timer.Stop()
     
     
    class MonApp(wx.App):
        def OnInit(self):
            fen = Bonjour("Exemple 1")
            fen.Show(True)
            self.SetTopWindow(fen)
            return True
     
    app = MonApp()
    app.MainLoop()

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Points : 36
    Points
    36
    Par défaut
    Merci Nyko,
    c'est effectivement cela. Je viens d'adapter cela à mon code et ça fonctionne parfaitement.
    J'ignorai que les traitements pouvaient bloquer le mainloop.

Discussions similaires

  1. Problème de focus avec une TTreeView
    Par Rustine dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/10/2005, 18h12
  2. [VB.net] Problème de synchronisation d'une base
    Par WriteLN dans le forum Windows Forms
    Réponses: 18
    Dernier message: 21/10/2005, 13h11
  3. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56
  4. problème de connexion avec une base firebird
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/05/2005, 11h40
  5. Problèmes d'accent avec une connexion ODBC et ADO
    Par michael.jacques dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/03/2005, 15h36

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