如何将变量连接到 Entry 小部件?
Posted
技术标签:
【中文标题】如何将变量连接到 Entry 小部件?【英文标题】:How to connect a variable to Entry widget? 【发布时间】:2011-02-01 05:09:26 【问题描述】:我正在尝试将变量与 Tkinter 条目小部件相关联,其方式如下:
每当我更改条目的值(“内容”)时,主要是通过在其中输入一些内容,变量会自动获得我输入的值。无需我先按下“更新值”按钮或类似的按钮。
每当变量被更改(通过程序的其他部分)时,我希望显示的条目值自动调整。我相信这可以通过文本变量起作用。
我阅读了http://effbot.org/tkinterbook/entry.htm 上的示例,但这并不能完全帮助我实现我的想法。我有一种使用条目的“验证”来确保第一个条件的方法。有什么想法吗?
【问题讨论】:
也许您可以提出一个替代方案? :) tkinter 有什么问题?根据 python 主页,它是“......Python 的事实上的标准 GUI 包”。还有“最常用的一种”。 控制变量:infohost.nmt.edu/tcc/help/pubs/tkinter/control-variables.html 当你说'变量'时,你是指像int
或str
这样的python变量还是像IntVar
或StringVar
这样的Tkinter变量?
***.com/questions/520015 包含对 Python 中的 GUI 工具包的讨论,这将是讨论这些工具的相对优点的好地方。没有人提倡 Tkinter(也没有人真正反对它),这对我来说并不奇怪; Tk 在 90 年代被添加到 Python 时很流行,但它有点失去了光彩。它在 Windows 上看起来不错,但我从未见过在 Linux 上不可怕的 Python Tkinter 应用程序。我链接的线程中明显缺少的是 PyGTKpygtk.org——这些绑定已经成熟,GTK+ 是一个不错的框架。
【参考方案1】:
我想你想要这样的东西。在下面的示例中,我创建了一个变量 myvar
并将其分配给 Label
和 Entry
小部件的 textvariable
。这样,两者是耦合的,Entry 小部件中的更改将自动反映在 Label 中。
您也可以在变量上set trace,例如写入标准输出。
from tkinter import *
root = Tk()
root.title("MyApp")
myvar = StringVar()
def mywarWritten(*args):
print "mywarWritten",myvar.get()
myvar.trace("w", mywarWritten)
label = Label(root, textvariable=myvar)
label.pack()
text_entry = Entry(root, textvariable=myvar)
text_entry.pack()
root.mainloop()
【讨论】:
谢谢,这是正确的方向,但是要使用变量,我需要将它们转换为普通的 python 变量。您的示例有效,因为小部件共享相同的文本变量。但是,例如,如果您想在条目内容发生更改时将其打印到标准输出,而不是将其写入 tkinter 标签中,您会怎么做? 你这样做:text_entry.bind('<Key>', handler)
其中handler
是一个分配你的python变量的函数。看我的回答。
@Sano98,我已经编辑了答案,您可以轻松跟踪变量以进行读/写
谢谢,在我遇到了 Brian Oakley 描述的问题后,我使用了你的建议,尝试按照 bpowah 的建议绑定到 keyppress。经过一番研究,我现在发现跟踪似乎是为这样的问题量身定做的。但是当使用 IntVar 而不是 StringVar 时,在完全删除条目的内容时会发生 ValueError - 空文字“”对于 int 转换无效。它的值为 0,这是我所期望的,但有没有办法避免错误?还是以某种方式抓住它?
@Sano98,您可以更改 tkinter 中定义的全局 getint,或者更好地从 IntVar 派生一个类来覆盖 get,或者可能有更好的方法,您可以问另一个问题以上是关于如何将变量连接到 Entry 小部件?的主要内容,如果未能解决你的问题,请参考以下文章