如何在Tkinter的Entry控件修改时获取事件回调?
正如问题所说,Text
组件有一个叫做 <<Modified>>
的事件,但 Entry
组件似乎没有这个事件。
9 个回答
13
谢谢你,Steven!Russell Owen的Tkinter Folklore书里讲了怎么通过globalgetvar()直接从名字参数(PY_VAR#)获取StringVar的值,但没有说明怎么把这个名字和一个控件对应起来。你用lambda方法来改变回调参数的做法对我们这些Python新手来说简直像魔法一样。
当有多个输入框(Entry)时,通常需要知道不仅是值,还要知道哪个输入框被改变了。在Steven的例子上稍微扩展一下,下面的(Python3)代码传递了一个索引,可以用来跟踪多个输入框。
from tkinter import Tk, Frame, Label, Entry, StringVar
class Fruitlist:
def entryupdate(self, sv, i):
print(sv, i, self.fruit[i], sv.get())
def __init__(self, root):
cf = Frame(root)
cf.pack()
self.string_vars = []
self.fruit = ("Apple", "Banana", "Cherry", "Date")
for f in self.fruit:
i = len(self.string_vars)
self.string_vars.append(StringVar())
self.string_vars[i].trace("w", lambda name, index, mode, var=self.string_vars[i], i=i:
self.entryupdate(var, i))
Label(cf, text=f).grid(column=2, row=i)
Entry(cf, width=6, textvariable=self.string_vars[i]).grid(column=4, row=i)
root = Tk()
root.title("EntryUpdate")
app = Fruitlist(root)
root.mainloop()
67
在写这段内容的时候(2017年,Python 3.6,tkinter版本8.6.6),文档里提到.trace
这个功能已经不推荐使用了。现在推荐的写法似乎是:
sv.trace_add("write", callback)
这个方法非常好用,如果你想在变量每次改变的时候收到通知。不过,我的应用程序只想在用户完成文本编辑时收到通知。我发现利用“验证”机制来实现这个功能效果很好:
from tkinter import *
root = Tk()
sv = StringVar()
def callback():
print(sv.get())
return True
e = Entry(root, textvariable=sv, validate="focusout", validatecommand=callback)
e.grid()
e = Entry(root)
e.grid()
root.mainloop()
这样一来,每当输入框失去焦点时,就会调用callback
这个函数(我添加了第二个输入框,这样第一个输入框才能真正失去焦点!)
120
在你的输入框(Entry)中添加一个Tkinter的StringVar。然后,使用trace方法把你的回调函数绑定到这个StringVar上。
from Tkinter import *
def callback(sv):
print sv.get()
root = Tk()
sv = StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
e = Entry(root, textvariable=sv)
e.pack()
root.mainloop()