使用 <Key> 绑定的 Tkinter 中的条目小部件

Entry Widget in Tkinter with <Key> Bind

谁能帮我确定为什么打印语句似乎滞后于这段代码的输入?如果你 运行 这个短程序并在输入条目小部件中键入 1,2,3,4,5 ,触发该方法的事件将获得 typed_string Stringvar 的当前值,但它落后 1输入。有人可以解释为什么吗?更好的是,有没有人知道对生成文本的输入小部件的任何按键都会调用输入变量的显示值的方法?当前版本 python 是 3.8


import tkinter
from tkinter import *

class UI():
    def __init__(self, master):
        self.typed_string = StringVar()
        self.typed_string.set("")

        self.new_entry = tkinter.Entry(master, textvariable=self.typed_string)
        self.new_entry.pack()
        self.new_entry.bind("<Key>",self.check_string)

    def check_string(self, event):
        retrieved_string = self.typed_string.get()
        print(retrieved_string, " was retrieved string")
        print(self.new_entry.get(), " was get for entry widget")

def main():
    root = Tk()
    new_ui = UI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

input field with terminal output shown

如果你替换:

    self.new_entry.bind("<Key>",self.check_string)

    self.new_entry.bind("<KeyRelease>",self.check_string)

它做我认为你想要它做的事。

原因:Key事件被触发那个键的字符被添加到StringVar变量之前;或者更准确地说,在处理按键之前,如果它是一个普通的可打印键,其结果之一是将键的字符添加到变量中。 KeyRelease 事件在 按键被处理后触发,因此在您尝试打印字符时已将其添加到变量中。