在自己的观察者回调中修改tkinter变量

时间:2018-02-08 21:33:26

标签: python tkinter

我认为我不太明白tkinter变量何时通知观察者以及何时不通知观察者。特别是,我不明白为什么以下示例只调用f一次:

from tkinter import Tk, IntVar

Tk()

x = IntVar()

def f(*_):
   print("f called")
   x.set(1)

x.trace("w", f)
x.set(0)
print(x.get())

我希望它能够在反复打印f called或在某个时刻抛出异常时永远无法响应。相反,它只打印f called一次,打印1并退出。

1 个答案:

答案 0 :(得分:4)

每次更改值时都会调用回调,之外的回调在该回调中更改时。回调运行时禁用跟踪以防止无休止的递归循环。

这在trace man page中的规范tcl / tk文档中有所描述。以下是一个简短的片段。在这种情况下,commandPrefix指的是您的回调:

  

在读取或写入跟踪期间执行commandPrefix时,会暂时禁用变量上的跟踪。这意味着commandPrefix调用的读取和写入将直接发生,而无需再次调用commandPrefix(或任何其他跟踪)。但是,如果commandPrefix取消设置该变量,则将调用未设置的跟踪。