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

GTK+ avec Python Discussion :

Mise à jour texte label


Sujet :

GTK+ avec Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Mise à jour texte label
    Bonjour,
    Mon problème est sans doute trivial mais je n'ai pas trouvé de solution : quand je tente de mettre à jour plusieurs fois dans une seule fonction le texte d'un label, seule la dernière version est prise en compte.

    Sans trop y croire, j'ai suivi le conseil de la FAQ et mis des gtk.main_iteration partout, ça n'est pas mieux.

    Exemple de 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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import pygtk
    import gtk
    import time
     
    class affich:
     
    	def destroy(widget, data=None):
    		gtk.main_quit()
     
    	def __init__(self):
    		# Creation fenetre
    		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    		self.window.set_title("NTest")
    		self.window.connect("destroy", self.destroy)
    		label = gtk.Label("Texte 11111111")
    		self.window.add(label)
    		label.show()
    		self.window.show()
    		time.sleep(4)
    		label.set_text("Texte 22222222")
    		time.sleep(4)
    		label.set_text("Texte 33333333")
     
    	def main(self):
    		gtk.main()
     
     
    if __name__ == "__main__":
    	aff = affich()
    	aff.main()
    Le programme ci-dessus affiche uniquement Texte 3333333

    Vous l'aurez sans doute compris, je débute en python et en gtk...
    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    time.sleep est à éviter quand tu utilises gtk+, ça bloque toute mise à jour de l'interface graphique pendant 4 secondes. Je t'invite à regarder du côté de g_timeout_add si tu veux exécuter du code après que 4 secondes se soient écoulées (je sais plus le nom exact de la fonction en python).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse

    Malheureusement le problème ne vient pas du sleep.
    Le code original ayant révélé le problème n'en contenait pas. Il s'agissait d'une fonction qui faisait (ou pluôt tentait de faire) : affichage d'un texte d'attente, exécution d'un script puis affichage du texte de résultat, qui était seul à s'afficher.

    Pour en être certain j'ai remplacé les sleeps par une boucle sur une addition et le résultat est le même : quand on fait plusieurs Label.set_text dans une même fonction, seul le dernier est pris en compte.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Oui, parce que tu re-fais la chose qui posait problème avec le sleep, tu bloques l'éxécution de ta fonction pour une durée arbitraire. Gtk+ ne rafraichit l'affichage que quand il est "en dehors" de toute fonction que tu as définie. Donc si tu bloques dans une de tes fonctions, c'est autant de temps pendant lequel ton interface ne sera pas rafraichie. De même, si tu changes 3 fois la valeur d'un label dans la meme fonction, seul le dernier changement sera pris en compte quand gtk+ reprendra la main.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    j'ai résolu mon problème pratique en ajoutant un
    while gtk.events_pending():
    gtk.main_iteration()

    La première fois j'avais oublié la boucle...

    En revanche le problème théorique subsiste car dans mon programme de test où je fais trois mises à jours de l'etiquette, seules les deux dernières modifs sont visibles...
    Je mets le code ici au cas où (dommage que l'indentation se perde) :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import pygtk
    import gtk
     
     
    class affich:
     
    	def destroy(widget, data=None):
    		gtk.main_quit()
     
    	def __init__(self):
    		# Creation fenetre
    		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    		self.window.set_title("NTest")
    		self.window.set_border_width(10)
    		self.window.connect("destroy", self.destroy)
    		label = gtk.Label("Texte 00000")
    		while gtk.events_pending():
    			gtk.main_iteration()
    		self.window.add(label)
    		label.show()
    		self.window.show()
    		while gtk.events_pending():
    			gtk.main_iteration()
    		label.set_text("Texte 1111111")
     
    		while gtk.events_pending():
    			gtk.main_iteration()
    		count = 0
    		while (count < 10000000):	
    			count = count + 1
    		label.set_text("Texte 22222222")
    		while gtk.events_pending():
    			gtk.main_iteration()
    		count = 0
    		while (count < 10000000):	
    			count = count + 1
    		label.set_text("Texte 33333333")
     
    	def main(self):
    		gtk.main()
     
     
    if __name__ == "__main__":
    	aff = affich()
    	aff.main()
    Merci à teuf13 pour son aide

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Citation Envoyé par TheMelon Voir le message
    En revanche le problème théorique subsiste car dans mon programme de test où je fais trois mises à jours de l'etiquette, seules les deux dernières modifs sont visibles...
    Pour la 3ème fois, il faut utiliser http://www.pygtk.org/docs/pygobject/...ut-add-seconds (ce qui permet aussi de virer les while () que tu as ajouté)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Mon besoin n'est pas d'attendre 4 secondes, c'est de :
    afficher une étiquette
    Attendre un click
    modifier l'étiquette
    faire quelque chose
    modifier l'étiquette

    La fonction vers laquelle tu pointes permet d'exécuter périodiquement du code, ce qui ne correspond pas à ce que je fais, les boucles d'attente n'avaient été insérées dans le code d'exemple que pour qu'on ait le temps de voir ce qui se passait à l'affichage.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Dans ce cas, tu rajoutes un callback pour intercepter l'élément "clic" et tu changes le label dans le callback en question...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Mise à jour de label (comte à rebours)
    Par david_atx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2009, 12h40
  2. [C#]mise à jour du text d'un label
    Par FraktaL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/08/2006, 12h37
  3. Réponses: 2
    Dernier message: 08/08/2005, 11h27
  4. Affichage de texte est mise à jour de l'écran
    Par Galdor_sp dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/03/2004, 22h31
  5. [UPDATE] Mise à jour d'un type text
    Par nico1492 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/01/2004, 13h26

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