关于用户界面:为什么 Entry.get() 不返回最近一次击键的字符串? (tkinter,Python)

Why does Entry.get() not return a string with the most recent keystroke? (tkinter, Python)

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
import Tkinter as tk
root = tk.Tk()`

def printer(field) :
    print field.get()

entry = tk.Entry(root)
entry.pack()
entry.bind("<Key>", lambda event : printer(entry))

root.mainloop()

输入:
ABC

输出:
(空的)
一个
AB

在任何时候,它总是输出比当前输入字段中输入的文本少一个。那么,我该如何修复它呢?


我猜原因是回调出现在条目文本之前。但是,由于按下的键是作为事件传递的,因此可以手动将该信息添加到打印的字符串中。但是,这需要程序将特殊字符处理为退格符或换行符。

另一种解决方案,或者更确切地说是解决方法,——我更喜欢的一个——是定义一个 StringVar 并将其连接到 Entry 对象。 StringVar 有一个 trace 回调,它允许我们跟踪值的更新。因此,在新值可用之前,不会发生跟踪回调。这可以实现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Tkinter as tk
root = tk.Tk()

def printer(name, index, mode):
    print field_text.get()

field_text = tk.StringVar()
field_text.set('')
field_text.trace("w", printer)

entry = tk.Entry(root, textvariable=field_text)
entry.pack()

root.mainloop()

因此,这里我们读取的是 field_text 值,而不是 Entry 值,但它们应该始终相等。