在Python中跟踪 Tkinter 变量
在Python中没有内置的方法来跟踪变量。但是 tkinter 支持创建变量包装器,可以通过将“观察者”回调附加到变量来使用它。 tkinter.Variable 类具有 BooleanVar、DoubleVar、IntVar 和 StringVar 等构造函数,分别用于布尔值、双精度浮点值、整数和字符串,所有这些都可以注册到每次变量值被触发时触发的观察者访问。观察者保持活动状态,直到它被明确删除。还需要注意的是,与观察者关联的回调函数默认采用三个参数,即 Tkinter 变量的名称、tkinter 变量的索引(如果它是一个数组),否则为空字符串和访问模式。
在Python 3.5 和 2.7 以上的旧方法中,例如 trace_variable()、trace()、trace_vdelete () 和 trace_vinfo() 被下面提到的方法替换。
- 跟踪添加():
trace_add () 方法已替换 trace_variable() 方法。 trace_add() 方法用于向变量添加观察者,并在访问值时返回回调函数的名称。
Syntax : trace_add(self, mode, callback_name)
Parameters:
Mode: It is one of “array”, “read”, “write”, “unset”, or a list or tuple of such strings.
callback_name: It is the name of the callback function to be registered on the tkinter variable.
- 跟踪删除():
trace_remove() 方法替换了 trace_vdelete() 方法,用于注销观察者。它返回最初通过 trace_add() 方法注册观察者时使用的回调的名称。
Syntax : trace_remove(self, mode, callback_name)
Parameters:
Mode: It is one of “array”, “read”, “write”, “unset”, or a list or tuple of such strings.
callback_name: It is the name of the callback function to be registered on the tkinter variable.
- 跟踪信息():
trace_info() 方法已替换 trace_vinfo() 方法和 trace() 方法。它返回回调的名称。这通常用于查找要删除的回调的名称。除了 tkinter 变量本身之外,此方法不接受任何参数。
Syntax : trace_info(self)
为了更好地理解上述方法的意义,让我们举个例子,构建一个简单的小部件。虽然使用 Tkinter 变量作为 textvariable 每次变量更改时都会自动更新小部件,但有时开发人员可能希望在读取或修改(或更改)变量时进行一些额外的处理。这就是变量跟踪的用武之地。我们的回调函数将在每次小部件中的文本更改时触发,并返回一个字符串“Variable Changed”。
Python3
# Python program to trace
# variable in tkinter
from tkinter import *
root = Tk()
my_var = StringVar()
# defining the callback function (observer)
def my_callback(var, index, mode):
print ("Traced variable {}".format(my_var.get())
# registering the observer
my_var.trace_add('write', my_callback)
Label(root, textvariable = my_var).pack(padx = 5, pady = 5)
Entry(root, textvariable = my_var).pack(padx = 5, pady = 5)
root.mainloop()
让我们看看 trace_add() 方法注册一个观察者的代码,该观察者在小部件中的文本变量每次更改时都会被触发。
输出: