Могут ли стили tkinter быть расширены или объединены? - PullRequest
1 голос
/ 29 сентября 2019

Допустим, у меня есть стиль для кнопки.

import Tkinter as tk
import ttk

root = tk.Tk()
ttk.Style(root).configure('Border.TButton', borderwidth=4, relief='raised')

Я хочу другой стиль, который расширяет существующий. Например, с font=('Helvetica', 24). В настоящее время я жестко программирую все из стиля 'Border.TButton' следующим образом:

ttk.Style(root).configure('BorderBigFont.TButton', borderwidth=4, relief='raised', font=('Helvetica', 24))

Есть ли лучший способ?

Псевдокод того, что я спрашиваю (как бы я хотел, чтобы это работало):

ttk.Style(root).configure('BorderBigFont.TButton', font=('Helvetica', 24), extends='Border.TButton')

или, альтернативно, при установке стиля

ttk.Style(root).configure('BigFont.TButton', font=('Helvetica', 24))
ttk.Button(root, text='foo', style=['Border.TButton', 'BigFont.TButton'])

1 Ответ

2 голосов
/ 02 октября 2019

Вопрос : tkinter.Style быть расширен или объединен?

  1. Определить свой собственный class Style путем наследования от class ttk.Style.
  2. Метод перегрузки .configure(... для реализации extend=.
    1. Сохранить все kwargs= опции в атрибуте экземпляра self._style.
    2. По аргументу extend=, предварительно .configure(..., используя опции, сохраненные в self._style[...].
    3. Вперед к оригиналу ttk.Style.configure(....

enter image description here

import tkinter as tk
import tkinter.ttk as ttk

class Style(ttk.Style):
    EXTENDS = 'extends'

    def __init__(self, parent):
        super().__init__(parent)
        self._style = {}

    def configure(self, cls, **kwargs):
        self._style.setdefault(cls, {}).update(kwargs)

        extends = self._style.get(kwargs.get(Style.EXTENDS), {})
        super().configure(cls, **extends)

        super().configure(cls, **kwargs)

Использование :

Примечание : Чтобы изменить только размер шрифта, используйте None: font=(None, ....

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        buttonbox = tk.Frame(self)
        buttonbox.grid(row=0, column=0)

        style = Style(self)
        style.theme_use('clam')

        style.configure('Border.TButton', 
                        font=('Helvetica', 10), borderwidth=4, relief='raised')

        style.configure('BorderBigFont.TButton',
                        font=(None, 24),
                        extends='Border.TButton')

        style.configure('BorderRed.TButton',
                        bordercolor='red',
                        extends='Border.TButton')

        for _style in ['Border.TButton', 'BorderBigFont.TButton', 'BorderRed.TButton']:
            btn = ttk.Button(buttonbox, text=_style, style=_style)
            btn.grid()


if __name__ == "__main__":
    App().mainloop()

Протестировано с Python: 3,5 - 'TclVersion': 8,6 'TkVersion': 8,6

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