我想每次输入新字符时都打印条目的文本。 通过绑定和对小部件执行命令来完成此操作,不会打印出最后一个字符。
我猜想在执行绑定命令后,参数“ 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)
答案 0 :(得分:1)
这是因为绑定事件函数是在添加新键之前执行的。
这是一个简单的解决方法,它使用将验证添加到True
小部件的功能(验证器接受任何密钥,因为它始终返回validator
)。诀窍是,%P
函数被设置为接收文本将具有的值(如果允许更改),方法是在将其配置为Entry
时将其指定为通过validatecommand=(validator_command, '%P')
构建Entry
。
这里有documentation条关于向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()
小部件添加验证的信息,其中包含有关其工作方式的详细信息。
ffill
答案 1 :(得分:0)
我觉得这是事件处理程序的问题。键入键后,您的代码将首先注册一个键并执行绑定的命令execute_e。只有在处理完该事件并且事件处理程序返回后,它才会使用字符更新条目并继续更新tkinter变量。
因此,在更新变量并打印变量的先前版本之前,将出现打印命令。如果您尝试从条目中删除一个字符,则会看到您得到的前一个字符串是您刚刚删除的字符。
对您来说,解决此问题的最简单方法可能是将命令绑定到tkinter变量,而不是绑定键。像这样写变量时,请使用trace:
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()