在Tkinter中将<Key>绑定到一个条目
当我把事件 <Key>
绑定到一个输入框上,并读取内容时,内容的变化似乎有点延迟。我想要“动态更新”另一个输入框,显示根据多个输入框内容计算的结果,希望在输入框1一改变就能立刻更新。但是变化似乎没有被立即识别,只能识别到之前的变化。我不知道这样说是否清楚,换句话说就是:
如果我做了n次修改,系统只识别到前n-1次的修改。例如,如果输入框里是数字1000,我按了两次退格键,entry_1.get() 的结果会是100,而不是10。希望你现在明白我说的意思了 :)
代码片段(简化版):
self.entry_1.bind('<Key>',lambda d: self.update())
def update(self):
success=True
try:
float(self.entry_1.get())
float(self.entry_2.get())
except ValueError: success=False
if success:
self.entry_3.delete(0,"end")
x=(float(self.entry_1.get())*float(self.entry_2.get())
self.entry_3.insert("end", "%g" %x)
这可能是什么原因呢?
1 个回答
7
原因在于事件处理的顺序。这个顺序是由小部件的“绑定标签”(或称为bindtag)决定的。默认情况下,处理顺序是:小部件、类、顶层窗口(toplevel),然后是“全部”。举个例子,如果你在小部件上有一个绑定,在类上也有一个绑定,在包含这个小部件的顶层窗口上还有一个绑定,最后还有一个特殊的“全部”绑定,那么这些绑定会按照这个顺序依次触发。
我在这个回答中详细讲解了这个问题,回答了如何在Tkinter的文本小部件中绑定自我事件?这个问题。