2009-12-16 19 views
14

Estoy trabajando para obtener un widget de etiquetas python/tkinter para actualizar sus contenidos. Por un hilo anterior hoy, seguí instrucciones sobre cómo armar los widgets. Sin embargo, en tiempo de ejecución, el widget de etiqueta NO cambia el contenido, sino que simplemente conserva su contenido original. Por lo que puedo decir, decrement_widget() nunca se llama en absoluto. ¿Algunas ideas?Haciendo la actualización del widget de la etiqueta python/tkinter?

def snooze (secs): 
    """ 
    Snoozes for the given number of seconds. During the snooze, a progress 
    dialog is launched notifying the 
    """ 

    root = Tkinter.Tk() 
    prompt = 'hello' 
    label1 = Tkinter.Label(root, text=prompt, width=len(prompt)) 
    label1.pack() 

    remaining = secs 

    def decrement_label(): 
    text = "Snoozing %d sec(s)" % remaining 
    remaining -= 1 
    label1.config(text=text, width=100) 
    label1.update_idletasks() 

    for i in range(1, secs + 1): 
    root.after(i * 1000, decrement_label) 

    root.after((i+1) * 1000, lambda : root.destroy()) 
    root.mainloop() 

Respuesta

16

Usted desea establecer de textvariable con un StringVar la etiqueta; cuando cambia el StringVar (llamando al myStringVar.set("text here")), el texto de la etiqueta también se actualiza. Y sí, estoy de acuerdo, esta es una forma extraña de hacer las cosas.

Ver the Tkinter Book un poco más de información sobre este:

puede asociar una variable Tkinter con una etiqueta. Cuando el contenido de la variable cambia, la etiqueta se actualiza automáticamente:

v = StringVar() 
Label(master, textvariable=v).pack() 

v.set("New Text!") 
+0

por su recomendación, me cambió la función decrement_label a 'text = ...; restante - = 1; sv = Tkinter.StringVar(); sv.Set (texto); label1.conf (text = sv, width = 100); label1.update_idletasks() '. Sin embargo, esto no ha tenido ningún efecto en el comportamiento del tiempo de ejecución. ¡La función decrement_label NO parece llamarse en absoluto! –

+0

También descubrí que la declaración 'restante - = 1' parece estar causando el problema. Python silenciosamente falla de alguna manera cuando encuentra esa declaración. ¿Hay algo malo con eso? –

+0

Debe establecer 'StringVar' cuando crea' Label', y luego modificar esa misma instancia de 'StringVar'. No debería necesitar llamar repetidamente a 'label1.conf'. Publica tu código completamente actualizado. –

5

Creo que está recibiendo un error de "referencia antes de la asignación" porque Python piensa remaining es en el ámbito local.

En Python 3, puede decir nonlocal remaining. Pero en Python 2, no creo que haya una manera de referirse a un alcance no local, no global. Esto funcionó para mí:

remaining = 0 

def snooze (secs): 
    """ 
    Snoozes for the given number of seconds. During the snooze, a progress 
    dialog is launched notifying the 
    """ 

    global remaining 
    root = Tkinter.Tk() 
    prompt = 'hello' 
    label1 = Tkinter.Label(root, text=prompt, width=len(prompt)) 
    label1.pack() 

    remaining = secs 

    def decrement_label(): 
    global remaining 
    text = "Snoozing %d sec(s)" % remaining 
    remaining -= 1 
    label1.config(text=text, width=100) 
    label1.update_idletasks() 

    for i in range(1, secs + 1): 
    root.after(i * 1000, decrement_label) 

    root.after((i+1) * 1000, lambda : root.destroy()) 
    root.mainloop() 
0
import tkinter 
    from tkinter import * 

    # just init some vars 
    remaining = 0     
    secs = 0 
    root = tkinter.Tk() 
    prompt = StringVar() 

    def snooze (secs): 
     """ 
     Snoozes for the given number of seconds. During the snooze, a progress 
     dialog is launched notifying the 
     """ 
     def decrement_label(): 
     global remaining, prompt 
     remaining -= 1 
     prompt.set('Snoozing %d sec(s)' % remaining) 
     label1.update_idletasks() 
     if not remaining: 
      print("end ... ") 
      root.destroy() 

     global remaining 
     prompt.set("hello") 
     label1 = tkinter.Label(root, textvariable=prompt, width=30) 
     label1.pack() 

     remaining = secs 
     for i in range(1, secs + 1): 
     root.after(i * 1000, decrement_label) 

    snooze(10) 
    root.mainloop() 
Cuestiones relacionadas