python - 当关联的 StringVar 更改时,防止 tkinter Entry 获得焦点

标签 python tkinter

我有一个带有验证命令的 tkinter 条目,当条目获得焦点(“focusin”)时执行。该条目与StringVar 关联。似乎每当 StringVar 更改值时,Entry 就会获得焦点,从而触发验证命令。例如:

import Tkinter as tk

window = tk.Tk()
var = tk.StringVar()
def validate(*args):
    print("Validation took place")
    return True
entry = tk.Entry(validate="focusin", validatecommand=validate)
print("Entry created. Associating textvariable")
entry.config(textvariable=var)
print("textvariable associated. Changing value")
var.set("Text")
print("Value changed")
entry.pack()
tk.mainloop()

此代码生成以下输出:

Entry created. Associating textvariable
textvariable associated. Changing value
Validation took place
Value changed

请注意,验证命令的执行是由对 var.set 的调用引起的。 有没有办法让我更改 StringVar 的值而不导致其关联的 Entry 获得焦点?我无法暂时取消 StringVar 与 Entry 的关联,因为重新关联它们时,Entry 也会获得焦点。

最佳答案

我认为您的观察是不正确的:当您设置StringVar的值时,焦点不会改变。这可能只是一种边缘情况,仅在应用程序首次启动时发生。小部件可能在最初创建时获得焦点。一旦 GUI 启动并运行,设置变量将不会改变焦点。

official tk documentation不鼓励同时使用验证和变量。来自文档:

In general, the textVariable and validateCommand can be dangerous to mix. Any problems have been overcome so that using the validateCommand will not interfere with the traditional behavior of the entry widget.

在这种情况下没有理由使用StringVar。我的建议是删除它。 StringVar 的使用通常仅在您将同一变量用于多个小部件或在该变量上进行跟踪时才有用。您两者都没有做,所以只需停止使用 StringVar 即可。它添加了一个额外的对象来管理,但没有提供太多额外的好处。

关于python - 当关联的 StringVar 更改时,防止 tkinter Entry 获得焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35776277/

相关文章:

字典列表中的 Python Tkinter 单选按钮

python - 使用 Tkinter 进行“悬停”弹出窗口

python - 将收到的数据(从 Twisted)写入 tkinter 文本框

python - “wait_window”方法有什么作用?

python - Python 中时间戳字符串到秒的转换

python - 当我运行此 flask 代码时,什么也没有发生,值没有存储在 mongodb 数据库中

python - 将 Numpy 结构化数组转换为 Pandas 数据帧

python - 动态地将数组中的值分配给字典

python - 干燥类似的表单类

python - 在 Tkinter TreeView 中插入数据以更正列时面临问题