2009-12-16 11 views
14

Ich arbeite daran, ein Python/Tkinter-Label-Widget zu bekommen, um seinen Inhalt zu aktualisieren. In einem früheren Thread habe ich heute Anweisungen zum Zusammenstellen der Widgets ausgeführt. Zur Laufzeit verändert das Label-Widget jedoch NICHT den Inhalt, sondern behält einfach seinen ursprünglichen Inhalt bei. Soweit ich das beurteilen kann, wird decrement_widget() niemals aufgerufen. Irgendwelche Ideen?Aktualisierung des Python/Tkinter-Label-Widgets?

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

Antwort

16

Sie werden das Label des textvariable mit einem StringVar festlegen möchten; Wenn sich die StringVar ändert (indem Sie myStringVar.set("text here") aufrufen), wird auch der Text des Labels aktualisiert. Und ja, ich stimme zu, das ist eine seltsame Art, Dinge zu tun.

Siehe the Tkinter Book für ein wenig mehr Informationen zu diesem Thema:

Sie können eine Tkinter Variable mit einem Label zuordnen. Wenn der Inhalt der Variablen ändert, wird das Etikett automatisch aktualisiert:

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

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

Per Ihre Empfehlung, Ich habe die decrement_label Funktion ‚text = ...; verbleibend - = 1; sv = Tkinter.StringVar(); sv.Set (Text); label1.conf (text = sv, width = 100); label1.update_idletasks() '. Dies hat sich jedoch nicht auf das Laufzeitverhalten ausgewirkt. Die decrement_label-Funktion scheint überhaupt nicht aufgerufen zu werden! –

+0

Ich habe auch herausgefunden, dass die 'restliche - = 1' Anweisung das Problem verursacht. Python schlägt automatisch fehl, wenn es auf diese Anweisung trifft. Ist etwas nicht in Ordnung? –

+0

Sie müssen die 'StringVar' einstellen, wenn Sie die' Label' erstellen, und dann diese Instanz der 'StringVar' modifizieren. Sie sollten "label1.conf" nicht wiederholt aufrufen müssen. Veröffentlichen Sie Ihren vollständig aktualisierten Code. –

5

Ich glaube, Sie ein „vor der Zuweisung referenziert“ Fehler sind immer da Python denkt remaining im lokalen Bereich ist.

In Python 3 können Sie nonlocal remaining sagen. Aber in Python 2 glaube ich nicht, dass es einen Weg gibt, sich auf einen nicht-lokalen, nicht-globalen Bereich zu beziehen. Das ist für mich gearbeitet:

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