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

[pygtk] Mise a jour d'un gtk.Entry

9 réponses
Avatar
elfoiros
Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???

Code:

self.phonenumber.set_text("Envoi en cours ... Wait")
self.phonenumber.connect("activate", self.enter_callback,
self.phonenumber)
self.phonenumber.select_region(0, len(self.phonenumber.get_text()))

time.sleep(5)

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???

9 réponses

Avatar
elfoiros
Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???

Code:

self.phonenumber.set_text("Envoi en cours ... Wait")
self.phonenumber.connect("activate", self.enter_callback,
self.phonenumber)
self.phonenumber.select_region(0, len(self.phonenumber.get_text()))

time.sleep(5)

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


Désolé pour le doublon :-)

Avatar
NicolasP
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent aux systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message demande de mettre à jour une fenêtre de ton application (self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en cours) avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle retourne voir dans la liste des messages ce qu'il y a à faire. Elle y trouve le message de mise à jour de la fenêtre self.phonenumber, ce message est traité et le texte apparaît dans la fenêtre.
Il y a deux solutions :
- virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant le time.sleep()
La deuxième solution n'est pas recommandée.

Nicolas

Avatar
elfoiros
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent aux
systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message
demande de mettre à jour une fenêtre de ton application
(self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en cours)
avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle retourne
voir dans la liste des messages ce qu'il y a à faire. Elle y trouve le
message de mise à jour de la fenêtre self.phonenumber, ce message est
traité et le texte apparaît dans la fenêtre.
Il y a deux solutions : - virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant le
time.sleep() La deuxième solution n'est pas recommandée.

Nicolas
Pour les besoins de l'exemple, j'ai mis time.sleep(5).En realité

l'application fais un appele systeme (os.system) qui peut prendre du
temps. Donc la solution 1 qui consiste à virer le time.sleep(5) n'est
pas possible.
Je vais tester ta solution 2 ... Si je trouve comment la mettre en
oeuvre :-)


Avatar
NicolasP
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent
aux systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message
demande de mettre à jour une fenêtre de ton application
(self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en cours)
avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle
retourne voir dans la liste des messages ce qu'il y a à faire. Elle y
trouve le message de mise à jour de la fenêtre self.phonenumber, ce
message est traité et le texte apparaît dans la fenêtre.
Il y a deux solutions : - virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant le
time.sleep() La deuxième solution n'est pas recommandée.

Nicolas
Pour les besoins de l'exemple, j'ai mis time.sleep(5).En realité

l'application fais un appele systeme (os.system) qui peut prendre du
temps. Donc la solution 1 qui consiste à virer le time.sleep(5) n'est
pas possible.
Dans ce cas, il faut utiliser un thread pour le système fenêtré et un thread pour l'appel système.

Je vais tester ta solution 2 ... Si je trouve comment la mettre en
oeuvre :-)
Je déconseille vraiment. Un des effets de bord est que l'application ne réagit à plus rien. Par exemple, si une fenêtre d'une autre application vient par dessus celles de ton appli puis disparait, les fenêtres de ton appli ne seront pas mises à jour.


Nicolas



Avatar
Alain BARTHE
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent
aux systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message
demande de mettre à jour une fenêtre de ton application
(self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en cours)
avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle
retourne voir dans la liste des messages ce qu'il y a à faire. Elle y
trouve le message de mise à jour de la fenêtre self.phonenumber, ce
message est traité et le texte apparaît dans la fenêtre.
Il y a deux solutions : - virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant le
time.sleep() La deuxième solution n'est pas recommandée.

Nicolas
Pour les besoins de l'exemple, j'ai mis time.sleep(5).En realité

l'application fais un appele systeme (os.system) qui peut prendre du
temps. Donc la solution 1 qui consiste à virer le time.sleep(5) n'est
pas possible.
Dans ce cas, il faut utiliser un thread pour le système fenêtré et un

thread pour l'appel système.
Je vais tester ta solution 2 ... Si je trouve comment la mettre en
oeuvre :-)
Je déconseille vraiment. Un des effets de bord est que l'application ne

réagit à plus rien. Par exemple, si une fenêtre d'une autre application
vient par dessus celles de ton appli puis disparait, les fenêtres de ton
appli ne seront pas mises à jour.

Nicolas


Peut-être un fork () avec un exec() dans le processus fils a la place de
ta commande system () resoudrait le probleme.

Sinon, utiliser un thread pour lancer ta commande.

Ces deux possibilités devraient laisser la main au gestionnaire de
fenêtres et lui permettre de mettre à jour ton label.




Avatar
c-note
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite
j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non
avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent
aux systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message
demande de mettre à jour une fenêtre de ton application
(self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en
cours) avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle
retourne voir dans la liste des messages ce qu'il y a à faire. Elle
y trouve le message de mise à jour de la fenêtre self.phonenumber,
ce message est traité et le texte apparaît dans la fenêtre.
Il y a deux solutions : - virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant le
time.sleep() La deuxième solution n'est pas recommandée.

Nicolas
Pour les besoins de l'exemple, j'ai mis time.sleep(5).En realité

l'application fais un appele systeme (os.system) qui peut prendre du
temps. Donc la solution 1 qui consiste à virer le time.sleep(5) n'est
pas possible.
Dans ce cas, il faut utiliser un thread pour le système fenêtré et un

thread pour l'appel système.
Je vais tester ta solution 2 ... Si je trouve comment la mettre en
oeuvre :-)
Je déconseille vraiment. Un des effets de bord est que l'application

ne réagit à plus rien. Par exemple, si une fenêtre d'une autre
application vient par dessus celles de ton appli puis disparait, les
fenêtres de ton appli ne seront pas mises à jour.

Nicolas


Peut-être un fork () avec un exec() dans le processus fils a la place de
ta commande system () resoudrait le probleme.

Sinon, utiliser un thread pour lancer ta commande.

Ces deux possibilités devraient laisser la main au gestionnaire de
fenêtres et lui permettre de mettre à jour ton label.



OK merci je vais forker :-)






Avatar
c-note
Bonjour,

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) ,
ensuite j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et
non avant ???


C'est normal. Ce n'est pas un problème lié à python. C'est inhérent
aux systèmes graphiques.
Quand tu fais ceci
self.phonenumber.set_text("Envoi en cours ... Wait"
que se passe t-il ?
En fait, set_text() envoie un message à ton application. Ce message
demande de mettre à jour une fenêtre de ton application
(self.phonenumber). C'est tout.
Ensuite, tu bloques toute l'application (du moins le thread en
cours) avec le time.sleep().
Une fois que le délai est passé, ton appli est débloquée. Elle
retourne voir dans la liste des messages ce qu'il y a à faire. Elle
y trouve le message de mise à jour de la fenêtre self.phonenumber,
ce message est traité et le texte apparaît dans la fenêtre.
Il y a deux solutions : - virer le time.sleep()
- appeler la boucle de traitement des messages manuellement avant
le time.sleep() La deuxième solution n'est pas recommandée.

Nicolas
Pour les besoins de l'exemple, j'ai mis time.sleep(5).En realité

l'application fais un appele systeme (os.system) qui peut prendre du
temps. Donc la solution 1 qui consiste à virer le time.sleep(5)
n'est pas possible.
Dans ce cas, il faut utiliser un thread pour le système fenêtré et un

thread pour l'appel système.
Je vais tester ta solution 2 ... Si je trouve comment la mettre en
oeuvre :-)
Je déconseille vraiment. Un des effets de bord est que l'application

ne réagit à plus rien. Par exemple, si une fenêtre d'une autre
application vient par dessus celles de ton appli puis disparait, les
fenêtres de ton appli ne seront pas mises à jour.

Nicolas


Peut-être un fork () avec un exec() dans le processus fils a la place
de ta commande system () resoudrait le probleme.

Sinon, utiliser un thread pour lancer ta commande.

Ces deux possibilités devraient laisser la main au gestionnaire de
fenêtres et lui permettre de mettre à jour ton label.



OK merci je vais forker :-)

Vous aurez compris que c-note = elfoiros (Compte perso et boulot) :-)







Avatar
Thierry B.
--{ Alain BARTHE a plopé ceci: }--

Peut-être un fork () avec un exec() dans le processus fils a la place de
ta commande system () resoudrait le probleme.

Un system(), à la base, c'est quand même un peu fork()+exec()...



--
Les typographes pervers sont vraiment partout...
http://linuxfr.org/~Phoenyx/24566.html

Avatar
Alain BARTHE
--{ Alain BARTHE a plopé ceci: }--

Peut-être un fork () avec un exec() dans le processus fils a la place de
ta commande system () resoudrait le probleme.

Un system(), à la base, c'est quand même un peu fork()+exec()...



C'est vrai tu as raison.


Si je me rappelle bien, c'est un fork dans lequel le fils est un shell
qui exécute la commande donnée en argument de system.

Il me semble que dans la commande system, le père soit mis en attente de
la terminaison du shell fils.

Il est possible que dans l'implémentation python, l'attente soit
bloquante et qu'il ne rende pas la main, bloquant ainsi le gestionnaire
de fenêtres.

Avec un fork, on peut éventuellement mieux gérer le problème, en se
mettant ou non en attente du fils.


A creuser.