2010-04-08 99 views
12

Escribí una secuencia de comandos de Python que hace alguna tarea para generar, y luego seguir cambiando un texto almacenado como una variable de cadena. Esto funciona, y puedo imprimir la cadena cada vez que se cambia.Actualizar Tkinter Etiqueta de la variable

Puedo obtener la etiqueta para mostrar la cadena por primera vez, pero nunca se actualiza.

Aquí está mi código:

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() 

La etiqueta mostrará Ready, pero no se actualizará para cambiar eso a las cuerdas a medida que se generan después.

Después de un poco de búsqueda en Google y mirando las respuestas en este sitio, pensé que la solución podría ser usar update_idletasks. Intenté poner eso después de cada vez que se cambió la variable, pero no ayudó.

+2

Posible duplicado de [Actualización de widget de etiqueta de python/tkinter?] (Http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos

Respuesta

16

La ventana solo se muestra una vez que se ingresa el enlace principal. Por lo tanto, no verá los cambios que realice en el bloque while True anterior a la línea root.mainloop().


Las interfaces de la GUI funcionan reaccionando a eventos mientras están en el bucle principal. Aquí hay un ejemplo donde StringVar también está conectado a un widget de Entrada. Cuando cambia el texto en el widget Entrada, cambia automáticamente en la Etiqueta.

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 

me gusta la siguiente referencia: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Aquí es un ejemplo práctico de lo que estaba tratando de hacer:

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 Introduzca bucle de eventos hasta que todos los eventos pendientes tienen procesado por Tcl.

+0

Gracias. Así que si te entiendo correctamente, si coloco el lazo principal antes del bloque While True, la etiqueta se mostrará inmediatamente para comenzar antes de que se ejecute el bloque. Pero luego no se actualizará en función de lo que está en el bloque While True, ya que se encuentra fuera del mainloop, ¿verdad? No parece ser, en cualquier caso ... – Tom

+0

** dividido en 2 comentarios debido al límite de caracteres ** Entonces, ¿qué tendría que hacer? Parece que si coloco Mainloop antes del bloque While True, no se mostrará nada en el bloque While True ... mientras que si lo coloco después, hará todo lo que esté en el bloque antes de mostrar ... Necesito un término medio. ¿Puedo escribir mainloop varias veces? Al igual que, después de cada vez que quiero que la pantalla se actualice? – Tom

+0

Bueno, lo intenté y no funcionó. Supongo que podría duplicar todo el asunto cada vez que quisiera una actualización ... como cerrar la etiqueta anterior y simplemente hacer una nueva en su lugar, en lugar de preocuparme por tener una y actualizarla ... pero parece una manera desordenada de hacer las cosas. – Tom

Cuestiones relacionadas