Главная


49. Использование и настройка стилей ttk

В рамках данной темы каждый виджет имеет класс widget class по умолчанию; мы используем этот термин, чтобы отличить классы ttk от классов Python.

У каждого виджета также есть стиль style. Стиль по умолчанию для виджета определяется его классом виджета, но вы можете указать другой стиль.

В ttk классы виджетов и стили задаются в виде строк. Во всех случаях, кроме одного, имя стиля виджета по умолчанию - это 'T' с префиксом к имени виджета; например, класс виджета кнопки по умолчанию - 'TButton'. Есть и исключения:

Таблица 63. Имена стилей для классов виджетов ttk

Класс виджета Имя стиля
Button TButton
Checkbutton TCheckbutton
Combobox TCombobox
Entry TEntry
Frame TFrame
Label TLabel
LabelFrame TLabelFrame
Menubutton TMenubutton
Notebook TNotebook
PanedWindow TPanedwindow (не TPanedWindow!)
Progressbar Horizontal.TProgressbar или Vertical.TProgressbar, в зависимости от опции orient.
Radiobutton TRadiobutton
Scale Horizontal.TScale или Vertical.TScale, в зависимости от опции orient.
Scrollbar Horizontal.TScrollbar или Vertical.TScrollbar, в зависимости от опции orient.
Separator TSeparator
Sizegrip TSizegrip
Treeview Treeview (не TTreeview!)

Во время выполнения вы можете получить класс виджета, вызвав его метод .winfo_class().

>>> b=ttk.Button(None)
>>> b.winfo_class()
'TButton'
>>> t=ttk.Treeview(None)
>>> t.winfo_class()
'Treeview'
>>> b.__class__  # Здесь мы запрашиваем класс Python
<class 'tkinter.ttk.Button'>

Имя стиля может иметь одну из двух форм.

Каждый стиль имеет соответствующий набор опций, которые определяют его внешний вид. Например, у кнопок есть опция foreground, которая изменяет цвет текста кнопки.

Чтобы изменить внешний вид стиля, используйте его метод .configure(). Первым аргументом этого метода является имя стиля, который вы хотите настроить, затем следуют аргументы с ключевыми словами, указывающие имена и значения опций, которые вы хотите изменить. Например, чтобы все ваши кнопки использовали зеленый текст, где s - экземпляр класса ttk.Style:

s.configure('TButton', foreground='green')

Чтобы создать новый стиль на основе некоторого стиля oldName, сначала создайте экземпляр ttk.Style, а затем вызовите его метод .configure(), используя имя вида 'newName.oldName'. Например, предположим, что вы не хотите использовать бордовый текст на всех кнопках, но хотите создать новый стиль, который будет использовать бордовый текст, и назвать новый стиль 'Kim.TButton':

s = ttk.Style()
s.configure('Kim.TButton', foreground='maroon')

Затем, чтобы создать кнопку в новом классе, вы можете использовать что-то вроде этого:

self.b = ttk.Button(self, text='Friday', style='Kim.TButton', command=self._fridayHandler)

Вы даже можете создавать целые иерархии стилей. Например, если вы настроите стиль с именем 'Panic.Kim.TButton', этот стиль унаследует все опции от стиля 'Kim.TButton', то есть любая опция, которую вы не зададите в стиле 'Panic.Kim.TButton', будет такой же, как и в стиле 'Kim.TButton'.

Когда ttk определяет, какое значение использовать для опции, он сначала смотрит в стиле 'Panic.Kim.TButton'; если в этом стиле нет значения для опции, он смотрит в стиле 'Kim.TButton'; и если этот стиль не определяет опцию, он смотрит в стиле 'TButton'.

Существует корневой стиль, имя которого '.'. Чтобы изменить вид некоторой характеристики по умолчанию для каждого виджета, вы можете настроить этот стиль. Например, предположим, что вы хотите, чтобы весь текст был набран 12 кеглем Helvetica (если это не отменено другим стилем или опцией font). Этого можно добиться с помощью такой конфигурации:

s = ttk.Style()
s.configure('.', font=('Helvetica', 12))

>> Слой элементов ttk