2017-01-26 40 views
1

下面是我正在测试的一些代码。在这段代码中,我可以创建一个窗口,顶部有一个标签,底部有一个入口字段。当我输入该输入字段时,我可以动态更改标签中的内容。现在,我已经包含了一个函数,试图通过存储在Entry小部件中预定义的内容来评估分配给“tex”的变量。这是“猫”。这是拿起:Python,Tkinter - 制作get()动态

tex = e.get() 

据我所知,get()并没有动态改变,因为我改变了入口小部件的文本。所以当我改变入口小部件中的字符串时,它不能变成“狗”。这可能吗?这里是代码:

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

任何帮助,将不胜感激。

+0

您正在错误地创建'StringVar'。它需要是'v = StringVar()'(注意尾部的'()') –

+0

我没有看到你想要达到的目标。当Entry内容改变时,StringVar'v'会动态变化,那么为什么还需要动态改变的另一个变量? –

+0

我不是无所事事。这只是一个练习,或多或少。我试图看看是否有可能影响条目字符串以触发条件循环,以便在影响字符串“cat”时“更改”标签小部件。换句话说,我希望当我开始退格并从猫身上移除“t”时,条目和小部件会立即得到改变。 –

回答

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方法。

+0

谢谢你的帮助! –