Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation time.sleep() avec wx

7 réponses
Avatar
j.cormouls
Bonjour,

J'=E9cris un programme dans lequel doivent d=E9filer 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=E9cute le programme, il me semble que la fonction sleep est
lanc=E9 avant la fin de SetLabel,
car le texte apparait tronqu=E9 (ex :Commentaires di).
Comment faire pour que SetLabel ait le temps de s'ex=E9cuter?

Merci de vos conseils

J=E9r=F4me

7 réponses

Avatar
hg
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

Avatar
jean-michel bain-cornu
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 ?

Avatar
j.cormouls
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


Avatar
jean-michel bain-cornu
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...

Avatar
jean-michel bain-cornu

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()

Avatar
j.cormouls
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


Avatar
elGringo
Juste pour info, il est possible de faire

app = wx.PySimpleApp(redirectúlse)

pour que les erreurs s'affichent dans la console standard.