Как правильно переопределить метод настройки виджетов tkinter? - PullRequest
0 голосов
/ 27 октября 2019

Мне нужен виджет записи, который хранит ссылку на его текстовую переменную (поскольку связанная переменная может измениться во время выполнения).

Поскольку 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, чтобы быть уверенным, что в некоторых сценариях оно не сломается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...