随着打印 Entry 的文本,最后一个字符被忽略。怎么修?

With printing Entry´s text, last character is dismissed. How to fix?

我想在每次写入一个新字符时打印一个条目的文本。 通过绑定和对小部件的命令执行此操作,不会打印最后一个字符。

我猜参数 'textvariable' 在执行绑定命令后正在更新。如何解决这个问题?

from tkinter import *
master = Tk()
var = StringVar()

def execute_e(key):
    print(var.get())

E = Entry(master, width=30, textvariable=var)
E.pack()
E.bind('<Key>', execute_e)

我觉得这是事件处理程序的问题。当键入一个键时,您的代码首先注册一个按键并执行绑定命令 execute_e。只有在它处理完这个并且你的事件处理程序有 return 之后,它才会用字符更新条目并继续更新 tkinter 变量。

因此,您的打印命令会在您的变量更新之前出现,并且您会打印之前版本的变量。如果您尝试从您的条目中删除一个字符,您会看到您得到的是您刚刚删除的字符所在的前一个字符串。

解决该问题的最简单方法可能是将命令绑定到 tkinter 变量而不是键绑定。像这样写入变量时使用跟踪来执行此操作:

var.trace('w', execute_e)

还有一些方法可以操纵事件处理程序并决定执行命令的顺序。 root.after_idle 将在代码无事可做时执行命令(当它已计算出您要求它做的所有其他事情时)。试试这个版本的代码:

from tkinter import *
master = Tk()
var = StringVar()

def execute_e(*key):
    def printy():
        print(var.get())
    master.after_idle(printy)

E = Entry(master, width=30, textvariable=var)
E.pack()
E.bind('<Key>', execute_e)
master.mainloop()

因为绑定的事件函数在添加新键之前正在执行

这是一个简单的解决方法,它使用向 Entry 小部件添加验证的能力(验证器接受任何密钥,因为它总是 returns True)。诀窍是 validator 函数是 set-up 以接收文本 将具有的值 如果通过指定 %P 允许更改时通过 validatecommand=(validator_command, '%P') 作为 Entry 构造的一部分进行配置。

这里有一些 documentation 关于向 Entry 小部件添加验证的内容,其中包含有关其工作原理的详细信息。

from tkinter import *

master = Tk()
var = StringVar()

def validator(new_value):
    print(f'new_value: {new_value}')
    return True

validator_command = master.register(validator)

E = Entry(master, width=30, textvariable=var,
          validate='key',
          validatecommand=(validator_command, '%P'))
E.pack()

master.mainloop()