请考虑以下代码:
text = Entry(); text.pack()
def show(e):
print text.get()
text.bind('<Key>', show)
假设我把字母ABC放在条目中,一个接一个。输出将是:
>>>
>>> A
>>> AB
请注意,按A键时会打印一个空字符串。当我按B时,它会打印A,而不是AB。如果我在C之后没有按任何东西,它将永远不会显示。看来条目内容只在绑定命令返回后才更新,所以我不能在该函数中使用实际的Entry值。
有没有办法在绑定命令中使用更新的Entry值?
答案 0 :(得分:3)
您可以使用<Key>
事件替换<KeyRelease>
事件。这应该有用。
以下是事件列表:http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types
答案 1 :(得分:2)
其原因与Tk“bindtags”有关。绑定与标记相关联,绑定按标记顺序处理。小部件名称和小部件类都是标记,它们按此顺序处理(特定于小部件的绑定,第二级的类绑定)。
出于这个原因,只要您按下某个键,您的小部件特定绑定就会在类绑定有机会修改小部件之前触发。
有许多变通方法。最简单的是绑定到<KeyRelease>
,因为类绑定发生在按键上。还有其他解决方案涉及添加或重新排列绑定标记,或使用条目小部件的内置数据验证功能。哪个最好取决于你真正想要完成的事情。
有关数据验证功能的详细信息,请参阅此问题:Interactively validating Entry widget content in tkinter
有关更全面的答案,请参阅Tkinter: set StringVar after <Key> event, including the key pressed