Виджеты ttk могут менять свой внешний вид во время выполнения программы. Например, когда виджет находится в состоянии disabled, он не реагирует на действия мыши или клавиатуры. Обычно отключенный виджет имеет другой внешний вид, чтобы пользователь мог понять, что виджет не будет реагировать на мышь.
В целом, каждый виджет ttk имеет набор флагов состояния, которые можно использовать для изменения внешнего вида виджета во время выполнения. Каждое состояние может быть установлено (включено) или сброшено (выключено) независимо от других состояний. Состояния и их значения:
active |
В данный момент мышь находится в виджете. |
alternate |
Это состояние зарезервировано для использования приложением. |
background |
В Windows или MacOS виджет находится в окне, которое не является окном переднего плана. |
disabled |
Виджет не будет реагировать на действия пользователя. |
focus |
Виджет в настоящее время имеет фокус. |
invalid |
Содержимое виджета в настоящее время недействительно. |
pressed |
Виджет в данный момент нажат (например, кнопка, на которую нажимают). |
readonly |
Виджет не позволяет никаким действиям пользователя изменять его текущее значение. Например, виджет Entry, доступный только для чтения, не позволит редактировать его содержимое. |
selected |
Виджет выбран. Примером могут служить чекбаттоны и радиобаттоны, находящиеся в состоянии "включено". |
Некоторые состояния изменяются в ответ на действия пользователя, например, состояние pressed кнопки. Ваша программа может опросить, очистить или установить любое состояние с помощью функций, описанных в разделе 46, "Методы, общие для всех виджетов ttk".
Логика, изменяющая внешний вид виджета, привязана к одному из его элементов. Чтобы опросить или настроить динамическое поведение для определенного стиля, для экземпляра s из ttk.Style, используйте этот метод, где styleName - имя элемента, например, 'Button.label' или 'border'.
s.map(styleName, *p, **kw)
Чтобы определить динамическое поведение одной из опций данного элемента стиля, передайте имя опции в качестве второго позиционного аргумента, и метод вернет список спецификаций изменения состояния.
Каждая спецификация изменения состояния представляет собой последовательность (s0, s1, n). Эта последовательность означает, что когда текущее состояние виджета соответствует всем элементам si, для опции устанавливается значение n. Каждый элемент si - это либо имя состояния, либо имя состояния, которому предшествует символ "!". Чтобы виджет соответствовал, он должен находиться во всех состояниях, описанных элементами, которые не начинаются с "!", и не должен находиться ни в одном из состояний, начинающихся с "!".
Например, предположим, что у вас есть экземпляр s класса ttk.Style, и вы вызываете его следующим образом:
changes = s.map('TCheckbutton', 'indicatorcolor')
Далее предположим, что возвращаемое значение будет:
[('pressed', '#ececec'), ('selected', '#4a6984')]
Это означает, что когда checkbutton находится в состоянии pressed, его опция indicatorcolor должна быть установлена на цвет '#ececec', а когда checkbutton находится в состоянии selected, его опция indicatorcolor должна быть установлена на '#4a6984'.
Вы также можете изменить динамическое поведение элемента, передав методу .map() один или несколько аргументов в виде ключевых слов. Например, чтобы получить поведение, описанное в примере выше, используйте этот вызов метода:
s.map('TCheckbutton',
indicatoron=[('pressed', '#ececec'), ('selected', '#4a6984')])
А вот более сложный пример. Предположим, вы хотите создать собственный стиль кнопки на основе стандартного класса TButton. Мы назовем наш стиль Wild.TButton; поскольку наше имя заканчивается на ".TButton", он автоматически наследует стандартные возможности стиля. Вот как настроить этот новый стиль:
s = ttk.Style()
s.configure('Wild.TButton',
background='black',
foreground='white',
highlightthickness='20',
font=('Helvetica', 18, 'bold'))
s.map('Wild.TButton',
foreground=[('disabled', 'yellow'),
('pressed', 'red'),
('active', 'blue')],
background=[('disabled', 'magenta'),
('pressed', '!focus', 'cyan'),
('active', 'green')],
highlightcolor=[('focus', 'green'),
('!focus', 'red')],
relief=[('pressed', 'groove'),
('!pressed', 'ridge')])
Изначально эта кнопка будет отображать белый текст на черном фоне, с выделением фокуса шириной 20 пикселей.
Если кнопка находится в состоянии 'disabled', она будет отображать желтый текст на пурпурном фоне.
Если кнопка в данный момент нажата, текст будет красным; если кнопка не имеет фокуса, фон будет голубым. Кортеж ('pressed', '!focus', 'cyan') - это пример того, как можно сделать атрибут зависимым от комбинации состояний.
Если кнопка активна (находится под курсором), текст будет синим на зеленом фоне.
Выделение фокуса будет зеленым, если кнопка имеет фокус, и красным, если не имеет.
Кнопка будет иметь рельеф в виде гребня, когда она не нажата, и рельеф в виде канавки, когда она нажата.