Главная


50.2. карты стилей ttk: динамическое изменение внешнего вида

Виджеты 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')])

>> Подключение логики приложения к виджетам