在Tkinter中将<Key>绑定到一个条目

8 投票
1 回答
3847 浏览
提问于 2025-04-17 00:31

当我把事件 <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的文本小部件中绑定自我事件?这个问题。

撰写回答