【问题标题】:Entry Widget in Tkinter with <Key> Bind带有 <Key> 绑定的 Tkinter 中的条目小部件
【发布时间】:2021-02-03 20:27:02
【问题描述】:

谁能帮我确定为什么打印语句似乎落后于这段代码的输入?如果您运行这个简短的程序并在输入条目小部件中键入 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

【问题讨论】:

标签: python tkinter text tkinter-entry


【解决方案1】:

如果你替换:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多