在下面的代码中,如果我使用KeyRelease
来绑定事件,那么点击return
键会导致文本小部件中出现不需要的新行。但是,如果我使用KeyPress
绑定事件,则不会插入新行。
有人可以解释两者之间的差异以及我观察这种行为的原因。任何指向推荐材料的指针都将受到赞赏。
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()
答案 0 :(得分:2)
在文本小部件上按下并释放键时,会引发<KeyPress>
,然后更新文本小部件,然后引发<KeyRelease>
。您可以使用处理这两个事件的小型演示程序轻松地自行验证。
绑定到<KeyPress>
时,可以通过从事件处理函数返回字符串"break"
来阻止事件传播到其他处理程序(以及更新文本窗口小部件的处理程序)。 / p>
如果绑定到<KeyRelease>
,则阻止插入换行已经太晚了,因为此时文本已经更新。
请注意,在您的示例中,您还可以处理<KeyPress-Return>
或仅<Return>
,而不是检查event.keysym == "Return"
。