Python Tkinter keyrelease事件在按键未按下时插入新行';T

Python Tkinter keyrelease事件在按键未按下时插入新行';T,python,tkinter,Python,Tkinter,在下面的代码中,如果我使用keyrease绑定事件,那么点击return键会在文本小部件中产生不需要的新行。但是,如果我使用按键绑定事件,则不会插入新行 有人能解释一下这两种行为之间的区别,以及我为什么观察到这种行为吗。如有任何参考资料,将不胜感激 from Tkinter import * def getCommand(*args): global text text.insert(END, "\n") text.insert(END, "command>")

在下面的代码中,如果我使用
keyrease
绑定事件,那么点击
return
键会在文本小部件中产生不需要的新行。但是,如果我使用
按键
绑定事件,则不会插入新行

有人能解释一下这两种行为之间的区别,以及我为什么观察到这种行为吗。如有任何参考资料,将不胜感激

from Tkinter import *

def getCommand(*args):
    global text
    text.insert(END, "\n")
    text.insert(END, "command>")
    return 'break'

def handle_keyrelease(event):
    if event.keysym == "Return":
        getCommand()
        return 'break'

root = Tk()
text = Text(root)
text.pack()
text.insert(END,"command>")
text.focus()
text.bind("<KeyRelease>", handle_keyrelease) # Change the event handler to see the difference

root.mainloop()
从Tkinter导入*
def GETCOMAND(*参数):
全局文本
文本。插入(结束,“\n”)
text.insert(结束,“命令>”)
返回“中断”
def句柄_钥匙释放(事件):
如果event.keysym==“Return”:
getCommand()
返回“中断”
root=Tk()
text=文本(根)
text.pack()
text.insert(结束,“命令>”)
text.focus()
text.bind(“,handle_keyrease)#更改事件处理程序以查看差异
root.mainloop()

当敲击并释放文本小部件上的键时,
被提升,然后文本小部件被更新,然后
被提升。使用一个处理这两个事件的小演示程序,您可以自己轻松地验证这一点

当绑定到
时,通过从事件处理程序函数返回字符串
“break”
,可以防止事件传播到其他处理程序(以及更新文本小部件的处理程序)

如果绑定到
,则阻止插入换行已经太晚了,因为此时文本已经更新

请注意,在您的示例中,您还可以处理
或只处理
,而不是检查
event.keysym==“Return”