Мне нужен виджет записи, который хранит ссылку на его текстовую переменную (поскольку связанная переменная может измениться во время выполнения).
Поскольку 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})
Я что-то напутал, не называя здесь суперклассы __setitem__
? Решение, кажется, работает, но я не знаю достаточно о внутренних элементах Tkinter
, чтобы быть уверенным, что в некоторых сценариях оно не сломается.