一种方法是利用可变类(的BooleanVar
,DoubleVar
,IntVar
,StringVar
,Variable
),以及它们的trace_add
方法。当实例拥有的值被修改时,它允许调用一个方法。
try: # In order to be able to import tkinter for
import tkinter as tk # either in python 2 or in python 3
except ImportError:
import Tkinter as tk
def do_stuff(*_): # trace_add implicitly passes 3 internal arguments
demo['text'] = var.get() # to obtain the value var holds
if __name__ == '__main__':
root = tk.Tk()
var = tk.StringVar(value="Value")
#var = tk.BooleanVar(value=True)
#var = tk.DoubleVar(value=2.78)
#var = tk.IntVar(value=0)
#var = tk.Variable(value=["Value", True, 2.78, 0])
demo = tk.Label(root, text=var.get())
demo.pack()
var.trace_add('write', do_stuff) # call do_stuff when var is set
var.set("New Value") # to replace the value var holds
#var.set(False)
#var.set(3.14)
#var.set(42)
#var.set(["New Value", False, 3.14, 42])
tk.mainloop()
还需要注意的是,尽管并非总是实用,但某些小部件具有变量选项(变量,文本变量,列表变量),这些选项允许它们持有的值与变量类对象的值同步。下面的示例利用了这一点:
try: # In order to be able to import tkinter for
import tkinter as tk # either in python 2 or in python 3
except ImportError:
import Tkinter as tk
if __name__ == '__main__':
root = tk.Tk()
var = tk.StringVar(value="Value")
demo = tk.Label(root, textvariable=var)
demo.pack()
var.set("New Value") # label is in sync right-away
tk.mainloop()
另一种方法是在使用class时__setattr__
利用对象的属性分配魔术方法。
例如,demo
标签将在每次self.string
修改属性时更新:
try: # In order to be able to import tkinter for
import tkinter as tk # either in python 2 or in python 3
except ImportError:
import Tkinter as tk
class MyLabel(tk.Label):
def __init__(self, master, var="", *args, **kwargs):
tk.Label.__init__(self, master, *args, **kwargs)
self.var = var
def __setattr__(self, name, value):
self.__dict__[name] = value
if name == 'var':
self.do_stuff()
def do_stuff(self):
self['text'] = self.var
if __name__ == '__main__':
root = tk.Tk()
demo = MyLabel(root, "Value")
demo.pack()
demo.var = "New Value"
tk.mainloop()