【问题标题】:How to connect a variable to Entry widget?如何将变量连接到 Entry 小部件?
【发布时间】:2011-02-01 05:09:26
【问题描述】:

我正在尝试将变量与 Tkinter 条目小部件相关联,其方式如下:

  1. 每当我更改条目的值(“内容”)时,主要是通过在其中输入一些内容,变量会自动获得我输入的值。无需我先按下“更新值”按钮或类似的按钮。

  2. 每当变量被更改(通过程序的其他部分)时,我希望显示的条目值自动调整。我相信这可以通过文本变量起作用。

我阅读了http://effbot.org/tkinterbook/entry.htm 上的示例,但这并不能完全帮助我实现我的想法。我有一种使用条目的“验证”来确保第一个条件的方法。有什么想法吗?

【问题讨论】:

  • 也许您可以提出一个替代方案? :)
  • tkinter 有什么问题?根据 python 主页,它是“......Python 的事实上的标准 GUI 包”。还有“最常用的一种”。
  • 当你说'变量'时,你是指像intstr这样的python变量还是像IntVarStringVar这样的Tkinter变量?
  • stackoverflow.com/questions/520015 包含对 Python 中的 GUI 工具包的讨论,这将是讨论这些工具的相对优点的好地方。没有人提倡 Tkinter(也没有人真正反对它),这对我来说并不奇怪; Tk 在 90 年代被添加到 Python 时很流行,但它有点失去了光彩。它在 Windows 上看起来不错,但我从未见过在 Linux 上不可怕的 Python Tkinter 应用程序。我链接的线程中明显缺少的是 PyGTKpygtk.org——这些绑定已经成熟,GTK+ 是一个不错的框架。

标签: python validation variables tkinter tkinter-entry


【解决方案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,或者可能有更好的方法,您可以问另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多