我知道这是一个老问题,但我认为我通过内部化控制变量找到了解决 tkinter 限制的方法。然后,您无需在创建小部件时声明单独的值:
class DynamicLabel(tkinter.Label):
def __init__(self, master, *args, **kwargs):
super().__init__(master=master, *args, **kwargs)
self.master = master
self.value=None
for kwarg, value in kwargs.items():
if kwarg == 'textvariable':
if not isinstance(value, tkinter.StringVar):
raise ValueError('Textvariable must be StringVar')
self.value = value
if not self.value:
self.value = tkinter.StringVar()
self.config(textvariable=self.value)
def set(self, txt):
self.value.set(txt)
def get(self):
return self.value.get()
这样做是为控制变量创建一个代理self.value
。
然后我们将遍历所有的 kwargs,如果textvariable
找到我们就self.value
引用它。
如果在创建小部件时没有设置文本变量,我们只需创建自己的并将其分配给小部件self.config(textvariable=self.value)
剩下的就是创建 set 和 get 方法来访问控制变量。
textvariable
我想通过忽略创建小部件时分配的任何内容并始终从头开始创建新小部件,可以进一步简化上述内容。
您甚至可以制作self.value
一个能够直接与之交互的属性self.value