Python:如何获取用于绑定命令的更新Entry文本?

1 投票
2 回答
1021 浏览
提问于 2025-04-16 07:39

考虑以下代码:

text = Entry(); text.pack()
def show(e):
    print text.get()
text.bind('<Key>', show)

假设我一个一个地在输入框里输入字母ABC。输出结果会是:

>>> 
>>> A
>>> AB

注意,当我按下A时,它打印的是一个空字符串。当我按下B时,它打印的是A,而不是AB。如果我在按下C后不再按任何键,它将永远不会显示。看起来输入框的内容只有在绑定的命令执行完后才会更新,所以我在那个函数里无法使用输入框的实际值。

有没有办法在绑定的命令中获取更新后的输入框值呢?

2 个回答

2

这个问题的原因和Tk的“绑定标签”有关。绑定是和标签相关联的,而这些绑定会按照标签的顺序进行处理。小部件的名称和小部件的类别都是标签,它们会按照这个顺序处理(小部件特定的绑定优先,其次是类别绑定)。

因此,每当你按下一个键时,你的小部件特定的绑定会在类别绑定有机会修改小部件之前就被触发。

有很多解决办法。最简单的方法是绑定到 <KeyRelease>,因为类别绑定是在按键时发生的。还有其他解决方案,包括添加或重新排列绑定标签,或者使用输入小部件的内置数据验证功能。哪种方法最好,取决于你真正想要实现的目标。

想了解更多关于数据验证功能的信息,可以查看这个问题:在tkinter中交互式验证输入小部件内容

如果想要更全面的答案,可以查看Tkinter:在<Key>事件后设置StringVar,包括按下的键

3

你可以把 <Key> 事件换成 <KeyRelease> 事件。这样应该就能正常工作了。

这里有一个事件的列表: http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types

撰写回答