为什么Entry.get()背后有一把钥匙?

时间:2013-12-03 09:14:07

标签: python python-3.x tkinter

请考虑以下代码:

#!/usr/bin/env python3

from tkinter import *
from tkinter.ttk import *

root = Tk()

entry = Entry(root)
entry.bind('<Key>', lambda e: print(entry.get()))
entry.grid()

Button(text="Close", command=root.destroy).grid()

root.mainloop()

每次按下一个键时,它会在entry输入框中打印文本,那么为什么它会打印文本,因为它是以前的一个键呢?

我怀疑是因为在将密钥添加到输入框之前运行了entry.get()。有办法解决这个问题吗?


示例:

当我输入以下内容时,一次只能输入一个键:

Python

打印以下内容

Pytho

2 个答案:

答案 0 :(得分:1)

我试图实时监控Entry小部件。

史蒂文对这个问题的answer提供了一种比绑定所有键更好的方法:

  

使用Tkinter.StringVar跟踪Entry小部件的值。您可以通过在StringVar上设置trace来验证StringVar的值。

如果有人想要,以下是修改为使用#!/usr/bin/env python3 from tkinter import * from tkinter.ttk import * root = Tk() text_var = StringVar() entry = Entry(root, textvariable=text_var) text_var.trace('w', lambda nm, idx, mode: print(text_var.get())) entry.grid() Button(text="Close", command=root.destroy).grid() root.mainloop() 的原始示例代码:

{{1}}

答案 1 :(得分:0)

问题的标题是“为什么Entry.get()背后有一把钥匙?”

简短的回答是:您在窗口小部件上创建的任何绑定都会在之前发生将字符插入窗口小部件的默认行为。原因是你可能想要改变或阻止默认行为,如果你的绑定在它发生之后触发就不可能了(你可以撤消默认行为,但是你无法阻止它)。

有一个合适的解决方案。答案就在这个stackoverflow答案中:https://stackoverflow.com/a/11542200/7432(来自问题Basic query regarding bindtags in tkinter)。更多信息在此stackoverflow答案中:python gui events out of order(来自问题python gui events out of order