如何将变量连接到 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 当你说'变量'时,你是指像intstr这样的python变量还是像IntVarStringVar这样的Tkinter变量? ***.com/questions/520015 包含对 Python 中的 GUI 工具包的讨论,这将是讨论这些工具的相对优点的好地方。没有人提倡 Tkinter(也没有人真正反对它),这对我来说并不奇怪; Tk 在 90 年代被添加到 Python 时很流行,但它有点失去了光彩。它在 Windows 上看起来不错,但我从未见过在 Linux 上不可怕的 Python Tkinter 应用程序。我链接的线程中明显缺少的是 PyGTKpygtk.org——这些绑定已经成熟,GTK+ 是一个不错的框架。 【参考方案1】:

我想你想要这样的东西。在下面的示例中,我创建了一个变量 myvar 并将其分配给 LabelEntry 小部件的 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 小部件?的主要内容,如果未能解决你的问题,请参考以下文章

Qt:如何将类连接到自定义 Qt 设计器小部件

如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

PyQt - 如何将多个信号连接到同一个小部件

如何在颤动中将 ListTile 连接到音频小部件

如何在 qt 设计器中将功能连接到 qt 小部件? - Python

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中