直到鼠标离开按钮区域,Tkinter Checkbutton的外观才会更新

时间:2018-09-05 09:34:29

标签: python checkbox tkinter

我想在单击TKinter.Checkbutton时更改其值。

该按钮是Checkbutton,我使用IntVar来跟踪/更改其值。

在下面的示例中,我只有一个按钮,并且我希望它在每次单击按钮时都将状态更改回0(在这种情况下,听起来可能很愚蠢,但我正在尝试解决另一种更为复杂的情况,即需要更改更多按钮值)。

该值实际上已更新,但是直到鼠标离开似乎是按钮区域的位置,按钮的外观才会改变。

这是最小的示例:

try :
    import Tkinter as tk
except ImportError as e:
    import tkinter as tk

root = tk.Tk()
val = tk.IntVar(root)
val.trace("w", lambda a, b, c: val.set(0))
button = tk.Checkbutton(root, text="button", variable=val)
button.pack()

root.mainloop()

要复制:

  • 启动应用程序

  • 单击按钮,但将鼠标保持在该按钮上(该按钮会将其外观更改为选中状态)

  • 离开按钮的区域(按钮最终将其外观更改为未选中)

为什么它要等待鼠标离开其区域? 我该如何强制按钮的外观立即更改?

谢谢

编辑:

使用ttk.Checkbutton似乎没有此问题。仍然没有解释为什么原始按钮会表现得如此,以及如何使用tk按钮实现所需的行为。

1 个答案:

答案 0 :(得分:2)

在同一变量的写跟踪中设置变量非常麻烦-如果Tcl在跟踪执行期间没有自动禁用跟踪,这将是无限递归。小部件对其显示值的更新本身是通过变量上的痕迹来处理的,因此显示不同步也就不足为奇了-令人惊讶的是它稍后又恢复了同步,我不知道这是怎么发生的。

如果必须从写入跟踪中执行此操作(而不是建议的command=选项(当变量处于更稳定的状态时会发生这种情况),则需要稍微推迟更改:{{ 1}}。