2010-04-08 10 views
12

J'ai écrit un script Python qui génère une tâche, puis je continue de modifier le texte stocké en tant que variable chaîne. Cela fonctionne, et je peux imprimer la chaîne chaque fois qu'il est changé.Mise à jour de l'étiquette Tkinter à partir de la variable

Je peux obtenir l'étiquette pour afficher la chaîne pour la première fois, mais elle ne met jamais à jour.

Voici mon code:

from tkinter import * 

outputText = 'Ready' 
counter = int(0) 

root = Tk() 
root.maxsize(400, 400) 

var = StringVar() 

l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398) 
l.pack() 

var.set(outputText) 

while True: 
    counter = counter + 1 
    outputText = result 
    outputText = result 
    outputText = result 
    if counter == 5: 
     break 

root.mainloop() 

L'étiquette indique Ready, mais ne sera pas mise à jour pour changer cela aux chaînes comme ils sont générés plus tard. Après un peu de googling et de regarder les réponses sur ce site, je pensais que la solution pourrait être d'utiliser update_idletasks. J'ai essayé de mettre cela après chaque fois que la variable a été changée, mais cela n'a pas aidé.

+2

Copie possible de [Mise à jour du widget d'étiquette python/tkinter?] (Http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos

Répondre

16

La fenêtre est affichée uniquement une fois que la boucle principale est entrée. Vous ne verrez donc aucun changement dans votre bloc while True précédant la ligne root.mainloop().


travail

d'interface GUI en faisant réagir à des événements tandis que dans la boucle principale. Voici un exemple où le StringVar est également connecté à un widget Entry. Lorsque vous modifiez le texte dans le widget Entrée, il change automatiquement dans l'étiquette.

from tkinter import * 

root = Tk() 
var = StringVar() 
var.set('hello') 

l = Label(root, textvariable = var) 
l.pack() 

t = Entry(root, textvariable = var) 
t.pack() 

root.mainloop() # the window is now displayed 

J'aime la référence suivante: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Voici un exemple concret de ce que vous essayez de faire:

from tkinter import * 
from time import sleep 

root = Tk() 
var = StringVar() 
var.set('hello') 

l = Label(root, textvariable = var) 
l.pack() 

for i in range(6): 
    sleep(1) # Need this to slow the changes down 
    var.set('goodbye' if i%2 else 'hello') 
    root.update_idletasks() 

root.update Entrez boucle d'événement jusqu'à ce que tous les événements en attente ont été traité par Tcl.

+0

Merci. Donc, si je vous comprends bien, si je mets mainloop avant le bloc While True, l'étiquette sera affichée immédiatement pour commencer avant que ce bloc ne soit exécuté. Mais alors, il ne sera pas mis à jour en fonction de ce qui est dans le bloc While True, puisque cela se trouve en dehors de la boucle principale, n'est-ce pas? Il ne semble pas être, en tout cas ... – Tom

+0

** divisé en 2 commentaires en raison de la limite de caractères ** Alors, que dois-je faire? Il semble que si je mets mainloop avant le bloc While True, rien dans le bloc While True ne sera affiché ... alors que si je le mets après, il fera tout dans le bloc avant d'afficher ... J'ai besoin d'un terrain d'entente. Puis-je écrire mainloop plusieurs fois? Comme, après chaque fois que je veux mettre à jour l'affichage? – Tom

+0

Eh bien, essayé cela et cela n'a pas fonctionné. Je suppose que je pourrais reproduire le tout chaque fois que je voulais une mise à jour ... comme, fermez l'ancienne étiquette et faites-en une nouvelle à sa place, au lieu de vous en soucier et de la mettre à jour ... mais cela semble si façon désordonnée de faire les choses. – Tom