【问题标题】:Python, Tkinter - Making get() dynamicPython,Tkinter - 使 get() 动态化
【发布时间】:2017-01-26 14:12:12
【问题描述】:

下面是我正在测试的一些代码。在这段代码中,我可以创建一个窗口并在顶部有一个标签,在底部有一个条目字段。当我输入该输入字段时,我可以动态更改标签中的内容。现在,我包含了一个函数,该函数试图通过存储 Entry 小部件中预定义的内容来评估分配给“tex”的变量。这是“猫”。这是由以下人员收集的:

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

任何帮助将不胜感激。

【问题讨论】:

  • 您创建的 StringVar 不正确。它必须是v = StringVar()(注意尾随()
  • 我看不出你想要达到什么目的。 StringVar v 在这里是在 Entry 内容发生变化时动态变化的,那为什么还需要另一个动态变化的变量呢?
  • 我不想一事无成。这只是一个练习,或多或少。我正在尝试查看是否有可能在我影响字符串“cat”后影响输入字符串以触发条件循环以“即时”更改标签小部件。换句话说,我希望当我开始退格并从 cat 中删除“t”时,条目和小部件会立即更改。
  • @Byran Oakley - 在 StringVar 的末尾有或没有 (),程序仍然可以工作,很奇怪。但我感谢你为我注意到这一点。我将更新代码以反映正确的格式。
  • 它在没有() 的情况下工作,只是偶然作为其实施方式的副作用。如果您以这种方式创建了两个字符串变量,它们将共享相同的数据。

标签: python tkinter


【解决方案1】:

要回答您的具体问题,不,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 方法。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2016-06-10
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多