2009-12-16 51 views
14

我正在努力獲取一個python/tkinter標籤小部件來更新其內容。根據今天早些時候的主題,我遵循了關於如何組裝小部件的說明。但是,在運行時,標籤小部件不會更改內容,只是保留其原始內容。據我所知,decrement_widget()根本不會被調用。有任何想法嗎?製作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() 

回答

16

你要設置的標籤的textvariableStringVar;當StringVar發生變化時(通過您致電myStringVar.set("text here")),標籤的文字也會更新。是的,我同意,這是一種奇怪的做事方式。

關於這一點了更多信息,請參見the Tkinter Book

您可以用標籤的Tkinter的變量關聯。當該變量的內容發生變化時,標籤會自動更新:

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

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

每你的建議,我改變了decrement_label功能爲「text = ...;剩餘 - = 1; sv = Tkinter.StringVar(); SV設定(文本); label1.conf(text = sv,width = 100); label1.update_idletasks()」。但是,這對運行時行爲沒有任何影響。 decrement_label函數根本不會被調用! – 2009-12-16 21:59:26

+0

我還發現「剩餘 - = 1」的陳述似乎是造成這個問題的原因。當Python遇到這個語句時,會以某種方式默默地失敗。它有什麼問題嗎? – 2009-12-16 22:23:07

+0

當你創建'Label'時,你必須設置'StringVar',然後修改'StringVar'的同一個實例。你不需要重複調​​用'label1.conf'。發佈完全更新的代碼。 – 2009-12-16 22:35:06

5

我覺得因爲Python認爲remaining是在局部範圍內你得到一個「引用賦值之前」的錯誤。

在Python 3中,你可以說nonlocal remaining。但在Python 2中,我不認爲有一種方法可以引用非本地非全局範圍。這爲我工作:

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