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

时间:2019-05-31 22:38:25

标签: python tkinter tkinter-entry

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

我猜想在执行绑定命令后,参数“ 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)

2 个答案:

答案 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()