我正在尝试使用TKinter创建一个表单,该表单从/多个条目窗口小部件中获取信息并将其用作文本窗口小部件的值 . 例如,这可能有效:
import Tkinter
from Tkinter import *
top = Tk()
e1 = Entry(top)
e2 = Entry(top)
t = Label(top, text = e1.get() + e2.get())
e1.pack()
e2.pack()
t.pack()
top.mainloop()
问题是这不会自动更新 . 我知道可以使用按钮完成,但我希望在用户键入Entry小部件时在Label小部件中计算/更新信息 . 什么是最好的是这样做?以下实现的while循环不起作用,因为程序进入top.mainloop()并且不退出:
import Tkinter
from Tkinter import *
top = Tk()
e1 = Entry(top)
e2 = Entry(top)
t = Label(top, text = e1.get() + e2.get())
e1.pack()
e2.pack()
while True:
t = Label(top, text = e1.get() + e2.get())
t.pack()
top.mainloop()
先感谢您 . 六
1 回答
while True
将无效,因为mainloop()
是某种while True
循环,它一直有效,直到你停止程序 .您必须使用
after(time_in_millisecond, function_name)
将function_name
添加到特殊队列,mainloop()
将在time_in_millisecond
之后运行它(仅一次) . 在time_in_millisecond
之后,执行的函数可以使用after()
再次运行 .第二种解决方案:您可以将
StringVar
与Entry
一起使用,并且可以将功能分配给StringVar
(使用trace()
),并且每次更改StringVar
时都将执行此功能 .第三种解决方案:您可以将事件(
<Key>
)绑定到Entry
,当您在Entry中按键时将调用某个函数 .最后的解决方案:当条目中的文本将被更改时,您可以在
Entry
中使用validatecommand=
与validate=
来调用某些函数 .见Tkinterbook:
The Tkinter Entry Widget,
Events and Bindings,
The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)
EDIT:
validatecommand=
与validate=
的示例 .并非所有小部件都有
validatecommand=
StringVar
和trace
的示例可能是大多数小部件的最佳解决方案 .
bind(<Key>, ...)
的示例在将char放入
Entry
之前调用绑定函数,以便在Entry
中获得没有最后一个字符的文本 . 这种方法不适合这种情况,但我保留了它 . 最终你可以获得event.char
并在文本中添加缺少的字符 .after()
的示例 .用于不同的重复工作 .