随着打印 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()
我想在每次写入一个新字符时打印一个条目的文本。 通过绑定和对小部件的命令执行此操作,不会打印最后一个字符。
我猜参数 '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()