在按键时没有插入新行的Tkinter keyrelease事件

时间:2013-09-02 03:47:52

标签: python tkinter

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

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意,在您的示例中,您还可以处理<KeyPress-Return>或仅<Return>,而不是检查event.keysym == "Return"