Précédent   Forum des professionnels en informatique > Autres langages > Python & Zope > GUI > wxPython
wxPython Forum d'entraide sur wxPython
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 14h46   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 82
Détails du profil
Informations personnelles :
Âge : 46

Informations forums :
Inscription : mai 2009
Messages : 82
Points : 14
Points : 14
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 :
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()
Yachas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 23h20   #2
Membre confirmé
 
Inscription : décembre 2007
Messages : 221
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 221
Points : 250
Points : 250
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 :
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()
nyko77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h05   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 82
Détails du profil
Informations personnelles :
Âge : 46

Informations forums :
Inscription : mai 2009
Messages : 82
Points : 14
Points : 14
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.
Yachas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h09.


 
 
 
 
Partenaires

Hébergement Web