1

在下面的代码中,如果我使用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()
4

1 回答 1

2

当在文本小部件上按下并释放键时,<KeyPress>会引发,然后更新文本小部件,然后再<KeyRelease>引发。您可以自己轻松地验证这一点,使用一个处理这两个事件的小演示程序。

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

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

请注意,在您的示例中,您还可以处理<KeyPress-Return>或简单地<Return>代替检查event.keysym == "Return".

于 2013-09-02T11:49:53.670 回答