1

考虑以下代码:

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

假设我将字母 ABC 一个一个地放入条目中。输出将是:

>>> 
>>> A
>>> AB

请注意,当按 A 时,它会打印一个空字符串。当我按 B 时,它会打印 A,而不是 AB。如果我在 C 之后不按任何内容,它将永远不会显示。似乎条目内容仅在绑定命令返回后才更新,因此我无法在该函数中使用实际的条目值。

有什么方法可以获取更新的条目值以在绑定命令中使用?

4

2 回答 2

3

您可以将<Key>事件替换为<KeyRelease>事件。那应该行得通。

以下是事件列表:http: //infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types

于 2010-11-26T18:06:31.467 回答
2

其原因与 Tk “bindtags”有关。绑定与标签相关联,并且按照标签顺序处理绑定。小部件名称和小部件类都是标签,它们按此顺序处理(首先是特定于小部件的绑定,其次是类绑定)。

出于这个原因,只要您按下一个键,您的小部件特定绑定就会在类绑定有机会修改小部件之前触发。

有很多解决方法。最简单的是绑定到,<KeyRelease>因为类绑定发生在按键上。还有其他解决方案涉及添加或重新排列绑定标签,或使用条目小部件的内置数据验证功能。哪个最好取决于您真正想要完成的工作。

有关数据验证功能的更多信息,请参阅此问题:Interactively validate Entry widget content in tkinter

有关更全面的答案,请参阅Tkinter: set StringVar after <Key> 事件,包括按下的键

于 2010-11-26T18:50:03.660 回答