В рамках данной темы каждый виджет имеет класс 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'>
Имя стиля может иметь одну из двух форм.
Все встроенные стили состоят из одного слова: например, 'TFrame' или 'TRadiobutton'.
Чтобы создать новый стиль, производный от одного из встроенных стилей, используйте имя стиля вида 'newName.oldName'. Например, чтобы создать новый стиль виджета Entry для хранения даты, вы можете назвать его 'Date.TEntry'.
Каждый стиль имеет соответствующий набор опций, которые определяют его внешний вид. Например, у кнопок есть опция 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))