Python 如何正确覆盖tkinter小部件的配置方法?
我需要一个条目小部件来保持对其textvariable的引用(因为关联的变量可能在运行时更改) 由于Python 如何正确覆盖tkinter小部件的配置方法?,python,tkinter,Python,Tkinter,我需要一个条目小部件来保持对其textvariable的引用(因为关联的变量可能在运行时更改) 由于some_entry['textvariable']返回一个无用的字符串,我编写了自己的类 import Tkinter as tk import ttk class MyEntry(ttk.Entry, object): 'entry that keeps a reference to its textvariable' def __init__(self, master, t
some_entry['textvariable']
返回一个无用的字符串,我编写了自己的类
import Tkinter as tk
import ttk
class MyEntry(ttk.Entry, object):
'entry that keeps a reference to its textvariable'
def __init__(self, master, textvariable, *args, **kwargs):
self.textvariable = textvariable
super(MyEntry, self).__init__(
master, *args, textvariable=textvariable, **kwargs)
def configure(self, *args, **kwargs):
self.textvariable = kwargs.get('textvariable', self.textvariable)
return super(MyEntry, self).configure(*args, **kwargs)
这与预期的效果一样:
python -i mcve.py
>>> root = tk.Tk()
>>> var1 = tk.StringVar(value='v1')
>>> var2 = tk.StringVar(value='v2')
>>> e = MyEntry(root, textvariable=var1)
>>>
>>> e.textvariable.get()
'v1'
>>> e.configure(textvariable=var2)
>>> e.textvariable.get()
'v2'
但是,通过[]
符号设置textvariable失败
>>> e['textvariable'] = var1
>>> e.textvariable.get()
'v2'
尝试
目前我只是使用
def __setitem__(self, what, value):
self.configure(**{what:value})
我没有在这里调用超类“
\uuuuu setitem\uuuuu
会把事情搞砸吗?解决方案似乎可行,但我对Tkinter
内部结构了解不够,无法确信它在某些情况下不会崩溃。“变量可能会改变”:方法不好,但无论如何,您必须实现才能启用类MyEntry(
是可订阅的。@stovfl我认为在不了解程序的情况下判断方法是不公平的。根据用户可以设置的选项,该条目绑定到具有不同输入验证(通过跟踪
)的变量。无论如何,我认为这是\uuuuu setitem\uuuuuuuuu
)