Python,Tkinter - 使get()动态化

时间:2017-01-26 14:12:12

标签: python tkinter

以下是我正在测试的一些代码。在这段代码中,我可以创建一个窗口,顶部有一个Label,底部有一个Entry字段。当我输入该输入字段时,我可以动态更改标签中的内容。现在,我已经包含了一个函数,它试图通过存储Entry小部件中预定义的内容来评估分配给" tex"的变量。这是" cat"。这可以通过以下方式获取:

tex = e.get()

我知道当我更改条目小部件中的文本时,get()不会动态更改。所以它不能改变为" dog"当我更改条目小部件中的字符串时。这可能吗?这是代码:

from Tkinter import *
import time

root = Tk()

def change():   
    if tex  == ("cat"):
        time.sleep(0.5)
        pass
    else:
        time.sleep(0.5)
        e.delete(0, END)
        e.insert(0, "dog")

v = StringVar()

e = Entry(root, textvariable=v)
e.insert(0, "cat")
e.pack(side=BOTTOM)
tex = e.get() #When text is defined with get(), it does not change 
              #dynamically with the entry widget


l = Label(root, textvariable=v)
l.pack(side=TOP)

change()

root.mainloop()

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

要回答您的具体问题,请注意,当条目小部件更改时,tex无法神奇地保持更新。该功能正是textvariable属性存在的原因 - 它使变量始终使用条目小部件中的值进行更新。如果您需要另一个变量中的数据,则必须调用.get()方法。

话虽如此,您可以在变量上设置跟踪,或者在条目小部件上设置绑定,并让它调用代码,可以在条目小部件更改时将tex更新为您想要的任何内容。

例如,以下代码显示了当条目窗口小部件中的值发生更改时如何调用callback

def callback(*args):
    global tex
    tex = e.get()
v.trace("w", callback)

有关传递给回调的参数的更多信息,请参阅What are the arguments to Tkinter variable trace method callbacks?

所有这一切,你的代码中都有一些严重的缺陷。首先,您正在错误地创建StringVar。它必须是v = StringVar()(请注意尾随())。

此外,您永远不应该在GUI程序的主线程中调用sleep。如果要在经过一段时间后执行某些代码,请阅读after方法。