我认为我不太明白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
并退出。
答案 0 :(得分:4)
每次更改值时都会调用回调,除之外的回调在该回调中更改时。回调运行时禁用跟踪以防止无休止的递归循环。
这在trace man page中的规范tcl / tk文档中有所描述。以下是一个简短的片段。在这种情况下,commandPrefix
指的是您的回调:
在读取或写入跟踪期间执行commandPrefix时,会暂时禁用变量上的跟踪。这意味着commandPrefix调用的读取和写入将直接发生,而无需再次调用commandPrefix(或任何其他跟踪)。但是,如果commandPrefix取消设置该变量,则将调用未设置的跟踪。