2010-04-08 5 views
12

Ich schrieb ein Python-Skript, das einige Aufgabe zu generieren, und dann ändern Sie einige Text als String-Variable gespeichert. Das funktioniert, und ich kann die Zeichenfolge jedes Mal drucken, wenn es geändert wird.Update Tkinter Label von Variable

Ich kann das Label erhalten, um die Zeichenfolge zum ersten Mal anzuzeigen, aber es wird nie aktualisiert.

Hier ist mein 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() 

Das Label wird Ready zeigen, wird aber nicht aktualisiert werden, dass auf die Saiten zu ändern, wie sie später erzeugt sind.

Nach ein wenig googeln und Antworten auf dieser Website, dachte ich, die Lösung könnte update_idletasks verwenden. Ich habe versucht, das nach jeder Änderung der Variablen zu tun, aber es hat nicht geholfen.

+2

Mögliche Duplikate von [Making Python/Tkinter Label Widget-Update?] (Http://StackOverflow.com/Questions/1918005/making-python-tkinter-Label-widget-Update) – Lafexlos

Antwort

16

Das Fenster wird nur angezeigt, nachdem der Hauptschleife eingegeben wurde. Sie werden also keine Änderungen in Ihrem while True Block vor der Zeile root.mainloop() sehen.


GUI-Schnittstellen Arbeit während im mainloop auf Ereignisse zu reagieren. Hier ist ein Beispiel, in dem die StringVar auch mit einem Eintrag-Widget verbunden ist. Wenn Sie den Text im Eingabe-Widget ändern, ändert sich automatisch die Beschriftung.

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 

Ich mag den folgenden Hinweis: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Hier ist ein funktionierendes Beispiel dafür, was Sie vorhatten:

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 Geben Sie Ereignisschleife, bis alle anstehenden Ereignisse haben wurde von verarbeitet.

+0

Vielen Dank. Also, wenn ich Sie richtig verstehe, wenn ich Mainloop vor dem While True Block setzen, wird die Bezeichnung sofort angezeigt, um mit zu beginnen, bevor dieser Block ausgeführt wird. Aber dann wird es nicht basierend auf dem While True Block aktualisieren, da das außerhalb der Hauptschleife liegt, oder? Es scheint auf keinen Fall so zu sein ... – Tom

+0

** wegen der Zeichenbegrenzung in 2 Kommentare aufgeteilt ** Also was müsste ich tun? Es sieht so aus, als wenn ich den Mainloop vor den While True Block setze, wird nichts im While True Block angezeigt ... während ich hinterher alles im Block vor der Anzeige mache ... Ich brauche etwas Mittelweg. Kann ich Mainloop mehrfach schreiben? Wie, nach jeder Zeit, die ich das Display aktualisieren möchte? – Tom

+0

Gut, versuchte das und es hat nicht funktioniert. Ich nehme an, ich könnte die ganze Sache jedes Mal duplizieren, wenn ich ein Update wollte ... wie, schließe das alte Etikett und mache einfach ein neues an seiner Stelle, anstatt sich darum zu sorgen, eins zu behalten und zu aktualisieren ... aber das scheint so ein chaotische Art, über Dinge zu gehen. – Tom