2010-04-08 29 views
12

Ho scritto uno script Python che esegue alcune attività per generare e quindi continuare a modificare del testo memorizzato come variabile stringa. Funziona, e posso stampare la stringa ogni volta che viene cambiata.Aggiorna etichetta Tkinter dalla variabile

Posso ottenere l'etichetta per visualizzare la stringa per la prima volta, ma non aggiorna mai.

Ecco il mio codice:

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'etichetta mostrerà Ready, ma non aggiornerà di cambiare la situazione per le stringhe come sono generati in seguito.

Dopo un bel po 'di ricerca su google e guardando attraverso le risposte su questo sito, ho pensato che la soluzione potrebbe essere quella di utilizzare update_idletasks. Ho provato a inserirmi dopo ogni volta che la variabile è stata cambiata, ma non ha aiutato.

+2

Possibile duplicato di [Aggiunta dell'aggiornamento del widget etichetta Python/tkinter?] (Http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos

risposta

16

La finestra viene visualizzata solo dopo aver inserito il mainloop. Pertanto, non vedrai alcuna modifica apportata nel blocco while True che precede la riga root.mainloop().


Le interfacce GUI funzionano reagendo agli eventi mentre si trovano nel mainloop. Ecco un esempio in cui StringVar è anche collegato a un widget Entry. Quando cambi il testo nel widget di entrata, esso cambia automaticamente nell'etichetta.

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 

mi piace il seguente riferimento: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Ecco un esempio di lavoro di quello che stavi cercando di fare:

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 Inserisci ciclo di eventi fino a quando tutti gli eventi in corso hanno stato elaborato da Tcl.

+0

Grazie. Quindi se ho capito bene, se metto mainloop prima del blocco While True, l'etichetta verrà visualizzata immediatamente per iniziare prima che quel blocco venga eseguito. Ma poi non si aggiornerà in base a cosa c'è nel blocco While True, dato che si trova fuori dal mainloop, vero? In ogni caso, non sembra essere ... – Tom

+0

** diviso in 2 commenti a causa del limite di caratteri ** Quindi cosa dovrei fare? Sembra che se metto mainloop prima del blocco While True nulla verrà visualizzato nel blocco While True ... mentre se lo metto in seguito, farà tutto nel blocco prima di essere visualizzato ... Ho bisogno di una via di mezzo. Posso scrivere mainloop più volte? Tipo, dopo ogni volta che voglio che il display si aggiorni? – Tom

+0

Beh, l'ho provato e non ha funzionato. Suppongo di poter duplicare l'intera cosa ogni volta che volevo un aggiornamento ... come, chiudere la vecchia etichetta e crearne una nuova al suo posto, invece di preoccuparsi di mantenerla e aggiornarla ... ma sembra una cosa del genere un modo disordinato per fare le cose. – Tom

Problemi correlati