2009-12-16 52 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()