В целом, части виджета собираются с помощью идеи "пустоты", пустого пространства, которое должно быть заполнено элементами.
Например, в теме classic кнопка состоит из четырех концентрических элементов. Снаружи внутрь это элементы выделение фокуса, граница, подложка и метка.
Каждый из этих элементов имеет атрибут 'sticky', который определяет, к скольким из четырех сторон полости он прилипает. Например, если элемент имеет атрибут sticky='ew', это означает, что он должен растягиваться, чтобы прилипнуть к левой (западной) и правой (восточной) сторонам своей полости, но не должен растягиваться по вертикали.
Большинство встроенных стилей ttk используют идею "макета" для организации различных слоев, составляющих виджет. Предполагая, что S является экземпляром ttk.Style, для получения макета этого стиля используйте вызов метода такой формы, где widgetClass - это имя класса виджета.
S.layout(widgetClass)
Некоторые классы виджетов не имеют макета; в этих случаях вызов метода приведет к возникновению исключения tk.TclError.
Для классов виджетов, у которых есть макет, возвращаемое значение представляет собой список кортежей (eltName, d). В каждом кортеже eltName - это имя элемента, а d - словарь, описывающий этот элемент.
Этот словарь может иметь значения для следующих ключей:
'sticky'
Строка, определяющая, как этот элемент должен быть расположен внутри своего родителя. Эта строка может содержать ноль или более символов 'n', 's', 'e' и 'w', относящихся к сторонам поля с соблюдением тех же соглашений, что и для якорей. Например, значение sticky='nsw' растягивает этот элемент, чтобы он примыкал к северной, южной и западной сторонам полости внутри своего родительского элемента.
'side'
Для элементов с несколькими дочерними элементами это значение определяет, как дочерние элементы будут располагаться внутри элемента. Значения могут быть 'left', 'right', 'top' или 'bottom'.
'children'
Если внутри данного элемента есть элементы, то эта запись в словаре представляет собой расположение дочерних элементов в том же формате, что и расположение верхнего уровня, то есть в виде списка двухэлементных кортежей (eltName, d).
Давайте разберем макет виджета Button из темы 'classic' в этом условном примере.
>>> from tkinter import ttk
>>> s = ttk.Style()
>>> s.theme_use('classic')
>>> b = ttk.Button(None, text='Yo')
>>> bClass = b.winfo_class()
>>> bClass
'TButton'
>>> layout = s.layout('TButton')
>>> layout
[('Button.highlight', {'sticky': 'nswe', 'children':
[('Button.border', {'sticky': 'nswe', 'border': '1', 'children':
[('Button.padding', {'sticky': 'nswe', 'children':
[('Button.label', {'sticky': 'nswe'})]})]})]})]
Все эти скобки, скобки и скобки делают эту структуру немного сложной для понимания. Вот как она выглядит в общих чертах:
Крайний элемент - это 'highlight' (выделение фокуса); он имеет стиль 'Button.highlight'. Его атрибут 'sticky' имеет значение 'nswe', что означает, что он должен расширяться во всех четырех направлениях, чтобы заполнить свою полость.
Единственным дочерним элементом выделения фокуса является элемент 'border' (граница) со стилем 'Button.border'. Он имеет ширину 'border' в 1 пиксель, а его атрибут 'sticky' также указывает, что он прилипает ко всем четырем сторонам своей полости, которая определяется внутренней частью элемента 'highlight'.
Внутри границы находится 'padding' (слой подложки) со стилем 'Button.padding'. Его атрибут sticky также указывает, что он заполняет полость.
Внутри слоя подложки находится 'label' (текст или изображение, или и то, и другое), который отображается на кнопке. Его стиль - 'Button.label', с атрибутом sticky='nswe'.
Каждый элемент имеет словарь опций элемента, которые влияют на внешний вид этого элемента. Имена этих опций - это обычные опции Tkinter, такие как 'anchor', 'justify', 'background' или 'highlightthickness'.
Чтобы получить список имен опций, используйте вызов метода такой формы, где S - экземпляр класса ttk.Style:
S.element_options(styleName)
Результатом будет последовательность строк опций. Продолжая наш условный пример выше, где s - экземпляр класса ttk.Style:
>>> d = s.element_options('Button.highlight')
>>> d
('highlightcolor', 'highlightthickness')
Чтобы узнать, какие атрибуты связаны с опцией элемента, используйте вызов метода в такой форме:
s.lookup(layoutName, optName)
Продолжаем наш пример:
>>> s.lookup('Button.highlight', 'highlightthickness')
1
>>> s.lookup('Button.highlight', 'highlightcolor')
'#d9d9d9'
>>> print(s.element_options('Button.label'))
('compound', 'space', 'text', 'font', 'foreground', 'underline', 'width',
'anchor', 'justify', 'wraplength', 'embossed', 'image', 'stipple', 'background')
>>> s.lookup('Button.label', 'foreground')
'black'