Utilisation time.sleep() avec wx

Le
j.cormouls
Bonjour,

J'écris un programme dans lequel doivent défiler automatiquement
quelques pages.
J'utilise un code du type :

def page1(self):

self.dd.SetLabel("Commentaires divers sur la page")
sleep(5)
self.page2()

Quand j'exécute le programme, il me semble que la fonction sleep est
lancé avant la fin de SetLabel,
car le texte apparait tronqué (ex :Commentaires di).
Comment faire pour que SetLabel ait le temps de s'exécuter?

Merci de vos conseils

Jérôme
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
hg
Le #613423
wrote:

Bonjour,

J'écris un programme dans lequel doivent défiler automatiquement
quelques pages.
J'utilise un code du type :

def page1(self):

self.dd.SetLabel("Commentaires divers sur la page")
sleep(5)
self.page2()

Quand j'exécute le programme, il me semble que la fonction sleep est
lancé avant la fin de SetLabel,
car le texte apparait tronqué (ex :Commentaires di).
Comment faire pour que SetLabel ait le temps de s'exécuter?

Merci de vos conseils

Jérôme


Bonjour,

Deux solutions à ma connaissance:

1) passer par un timer (à mon avis la bonne solution dans ton cas)
2) un thread.

hg

jean-michel bain-cornu
Le #613146
Bonjour,
J'écris un programme dans lequel doivent défiler automatiquement
quelques pages.
J'utilise un code du type :

def page1(self):

self.dd.SetLabel("Commentaires divers sur la page")
sleep(5)
self.page2()

Quand j'exécute le programme, il me semble que la fonction sleep est
lancé avant la fin de SetLabel,
car le texte apparait tronqué (ex :Commentaires di).
Comment faire pour que SetLabel ait le temps de s'exécuter?


Si j'ai bien compris ton problème, ce n'est pas à proprement parler une
question de temps d'exécution de SetLabel. Lorsque ton code s'exécute,
wx ne raffraîchit pas parfaitement l'interface car il se pourrait que tu
fasses d'autres modifications sur tes objets, et donc la mise à jour des
objets sur l'écran pourrait être à la fois coûteuse en temps et inutile.
Il attends donc que tu aie finis (le retour à MainLoop() en fait) avant
de mettre à jour comme il faut.

Je reproduit ton problème avec :
# -*- coding: iso-8859-1 -*-
import wx,time
class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,wx.ID_ANY)
self.sizer1 = wx.BoxSizer(wx.VERTICAL)
bt= wx.Button(self,wx.ID_ANY,'Test')
bt.Bind(wx.EVT_BUTTON,self.onButton)
self.sizer1.Add(bt)
self.texte= wx.StaticText(self,wx.ID_ANY,'valeur initiale')
self.sizer1.Add(self.texte)
self.SetSizer(self.sizer1)
self.Show()
self.i= 0
def onButton(self,event):
self.i+= 1
self.texte.SetLabel('essai n°%s de modification du texte'%self.i)
## self.refresh()
time.sleep(3)
app = wx.PySimpleApp()
frame=MainWindow(None,-1,'Test')
app.MainLoop()

Il suffit de forcer un raffaichissement pour obtenir le comportement
souhaité* (self.refresh() dans l'exemple)

A+
jm

* et non pas : le con porc te ment sous étai
Bin koi, c'est vendredi non ?

j.cormouls
Le #613145
On 11 mai, 17:37, jean-michel bain-cornu wrote:
Bonjour,

J'écris un programme dans lequel doivent défiler automatiquement
quelques pages.
J'utilise un code du type :

def page1(self):

self.dd.SetLabel("Commentaires divers sur la page")
sleep(5)
self.page2()

Quand j'exécute le programme, il me semble que la fonction sleep est
lancé avant la fin de SetLabel,
car le texte apparait tronqué (ex :Commentaires di).
Comment faire pour que SetLabel ait le temps de s'exécuter?


Si j'ai bien compris ton problème, ce n'est pas à proprement parler u ne
question de temps d'exécution de SetLabel. Lorsque ton code s'exécute,
wx ne raffraîchit pas parfaitement l'interface car il se pourrait que tu
fasses d'autres modifications sur tes objets, et donc la mise à jour des
objets sur l'écran pourrait être à la fois coûteuse en temps et i nutile.
Il attends donc que tu aie finis (le retour à MainLoop() en fait) avant
de mettre à jour comme il faut.

Je reproduit ton problème avec :
# -*- coding: iso-8859-1 -*-
import wx,time
class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,wx.ID_ANY)
self.sizer1 = wx.BoxSizer(wx.VERTICAL)
bt= wx.Button(self,wx.ID_ANY,'Test')
bt.Bind(wx.EVT_BUTTON,self.onButton)
self.sizer1.Add(bt)
self.texte= wx.StaticText(self,wx.ID_ANY,'valeur initiale')
self.sizer1.Add(self.texte)
self.SetSizer(self.sizer1)
self.Show()
self.i= 0
def onButton(self,event):
self.i+= 1
self.texte.SetLabel('essai n°%s de modification du texte'%self .i)
## self.refresh()
time.sleep(3)
app = wx.PySimpleApp()
frame=MainWindow(None,-1,'Test')
app.MainLoop()

Il suffit de forcer un raffaichissement pour obtenir le comportement
souhaité* (self.refresh() dans l'exemple)

A+
jm

* et non pas : le con porc te ment sous étai
Bin koi, c'est vendredi non ?


Merci pour ta réponse, mais je ne comprends pas bien le fonctionnement
de refresh():
Quand je teste ton programme, sans cette fonction, on retrouve bien le
problème que j'évoquais (setlabel incomplet),
mais quand on introduit refresh(), sleep() ne fonctionne plus !!!!
A+
jerome


jean-michel bain-cornu
Le #613144
Merci pour ta réponse, mais je ne comprends pas bien le fonctionnement
de refresh():
Quand je teste ton programme, sans cette fonction, on retrouve bien le
problème que j'évoquais (setlabel incomplet),
mais quand on introduit refresh(), sleep() ne fonctionne plus !!!!


Oui, c'est parce que je t'ai posté une grosse bêtise.
Le refresh s'écrit Refresh() avec un R, et le refresh() avec un r étant
inconnu, le programme ne va pas plus loin. L'exception étant trappée par
wx, ça ne se voit pas facilement.

Raaa ; il faut que je trouve autre chose...

jean-michel bain-cornu
Le #613143

Raaa ; il faut que je trouve autre chose...


Effectivement, ça va beaucoup mieux avec un timer (merci hg) !

# -*- coding: iso-8859-1 -*-
import wx,time
class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,wx.ID_ANY)
self.sizer1 = wx.BoxSizer(wx.VERTICAL)
bt= wx.Button(self,wx.ID_ANY,'Test')
bt.Bind(wx.EVT_BUTTON,self.onButton)
self.sizer1.Add(bt)
self.texte= wx.StaticText(self,wx.ID_ANY,'valeur initiale')
self.sizer1.Add(self.texte)
self.SetSizer(self.sizer1)
self.Show()
self.i= 0
self.Bind(wx.EVT_TIMER,self.onTest1Timer)
def onButton(self,event):
self.i+= 1
self.texte.SetLabel('essai n°%s de modification du texte'%self.i)
self.t1= wx.Timer(self)
self.t1.Start(2000)
def onTest1Timer(self,evt):
self.texte.SetLabel('ESSAI n°%s de modification du texte'%self.i)
app = wx.PySimpleApp()
frame=MainWindow(None,-1,'Test')
app.MainLoop()

j.cormouls
Le #613142
On 11 mai, 19:23, jean-michel bain-cornu wrote:
Raaa ; il faut que je trouve autre chose...


Effectivement, ça va beaucoup mieux avec un timer (merci hg) !

# -*- coding: iso-8859-1 -*-
import wx,time
class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,wx.ID_ANY)
self.sizer1 = wx.BoxSizer(wx.VERTICAL)
bt= wx.Button(self,wx.ID_ANY,'Test')
bt.Bind(wx.EVT_BUTTON,self.onButton)
self.sizer1.Add(bt)
self.texte= wx.StaticText(self,wx.ID_ANY,'valeur initiale')
self.sizer1.Add(self.texte)
self.SetSizer(self.sizer1)
self.Show()
self.i= 0
self.Bind(wx.EVT_TIMER,self.onTest1Timer)
def onButton(self,event):
self.i+= 1
self.texte.SetLabel('essai n°%s de modification du texte'%self .i)
self.t1= wx.Timer(self)
self.t1.Start(2000)
def onTest1Timer(self,evt):
self.texte.SetLabel('ESSAI n°%s de modification du texte'%self .i)
app = wx.PySimpleApp()
frame=MainWindow(None,-1,'Test')
app.MainLoop()


Merci à tous les deux pour ces aides rapides précises et précieuses...
Jérôme


elGringo
Le #613139
Juste pour info, il est possible de faire

app = wx.PySimpleApp(redirectúlse)

pour que les erreurs s'affichent dans la console standard.
Publicité
Poster une réponse
Anonyme