ttk_intro
Имя
ttk::intro — Введение в движок темы TkОбзор
Набор тематических виджетов Tk основан на переработанной и улучшенной версии TIP #48 (http://tip.tcl.tk/48) с улучшенным движком стилей. Основные понятия описаны ниже. Основная идея заключается в отделении, насколько это возможно, кода, реализующего поведение виджета, от кода, реализующего его внешний вид. Связанные с классом виджета функции в основном отвечают за поддержание состояния виджета и вызов обратных вызовов; все аспекты внешнего вида виджета контролируются стилем виджета (т. е. стилем элементов виджета).Темы
Тема — это набор элементов и стилей, определяющих внешний вид набора виджетов. Темы могут быть использованы для:- изоляции различий между платформами (X11 по сравнению с классическими Windows, XP и Aqua ...)
- адаптации к ограничениям отображения (низкое количество цветов, градации серого, монохромный режим, маленькие экраны)
- доступности (высокий контраст, крупный шрифт)
- брендирования набора приложений
- соответствия остальной части рабочего стола (Gnome, KDE, Java)
- и, конечно же: визуальных эффектов.
Элементы
Элемент отображает отдельную часть виджета. Например, виджет вертикальной полосы прокрутки содержит элементы uparrow, downarrow, trough и slider.Имена элементов используют рекурсивную точечную нотацию. Например, uparrow идентифицирует общий элемент стрелки, а Scrollbar.uparrow и Combobox.uparrow идентифицируют виджет-специфические элементы. При поиске элемента движок стилей сначала ищет элемент с указанным именем, а если такой элемент не найден, ищет универсальные элементы, удаляя последовательно ведущие компоненты имени элемента.
Как и виджеты, элементы имеют параметры, которые задают, что отображать и как это отображать. Например, элемент text (который отображает строку текста) имеет параметры -text, -font, -foreground, -background, -underline и -width. Значение параметра элемента берется из:
- параметра с таким же именем и типом в виджете, содержащем элемент;
- динамического значения, заданного картой стилей и текущего состояния;
- значения по умолчанию, заданного командой style configure; или
- значения параметра по умолчанию, встроенного в элемент.
Макеты
Макет определяет, из каких элементов состоит виджет и как они расположены. Движок макета использует упрощенную версию алгоритма pack: начиная с начальной области, равной размеру виджета, элементам выделяется участок в этой области вдоль стороны, указанной параметром -side, и размещаются на этом участке в соответствии с параметром -sticky. Например, макет для горизонтальной полосы прокрутки:ttk::style layout Horizontal.TScrollbar {
Scrollbar.trough -children {
Scrollbar.leftarrow -side left -sticky w
Scrollbar.rightarrow -side right -sticky e
Scrollbar.thumb -side left -expand true -sticky ew
}
} По умолчанию макет для виджета совпадает с именем его класса. Некоторые виджеты могут переопределять это (например, виджет ttk::scrollbar выбирает разные макеты в зависимости от параметра -orient).
Состояния
В стандартном Tk многие виджеты имеют параметр -state, который (в большинстве случаев) может быть либо normal, либо disabled. Некоторые виджеты поддерживают дополнительные состояния, например, виджет entry, у которого есть состояние readonly, и различные типы кнопок, у которых есть состояние active.Тематические виджеты Tk обобщают эту идею: каждый виджет имеет карту независимых флагов состояния. Флаги состояния виджета включают active, disabled, pressed, focus и т. д. (см. ttk::widget(n) для полного списка флагов состояния).
Вместо параметра -state, каждый виджет теперь имеет команду виджета state, которая используется для установки или запроса состояния. Спецификация состояния — это список символьных имён состояний, указывающих, какие биты установлены, каждый из которых необязательно предваряется восклицательным знаком, указывающим, что бит сброшен.
Например, привязки класса для виджета ttk::button:
bind TButton <Enter> { %W state active }
bind TButton <Leave> { %W state !active }
bind TButton <ButtonPress-1> { %W state pressed }
bind TButton <Button1-Leave> { %W state !pressed }
bind TButton <Button1-Enter> { %W state pressed }
bind TButton <ButtonRelease-1> \
{ %W instate {pressed} { %W state !pressed ; %W invoke } } Это означает, что виджет переходит в состояние active при входе курсора в виджет и выходит из него при выходе. Аналогично, он переходит в состояние pressed при нажатии кнопки мыши и в состояние !pressed при событии ButtonRelease. Кроме того, кнопка отжимается, если указатель перетаскивается за пределы виджета, пока зажата кнопка мыши 1, и снова нажимается, если он перетаскивается обратно. Наконец, когда кнопка мыши отпускается, вызывается команда -command виджета, но только если кнопка в настоящее время находится в состоянии pressed. (Фактические привязки немного сложнее, но ненамного).
Стили
Каждый виджет связан со стилем, который задаёт значения для параметров элементов. Имена стилей используют рекурсивную точечную нотацию, как макеты и элементы; по умолчанию виджеты используют имя класса для поиска стиля в текущей теме. Например:ttk::style configure TButton \ -background #d9d9d9 \ -foreground black \ -relief raised \ ;
Многие элементы отображаются по-разному в зависимости от состояния виджета. Например, у кнопок другой фон, когда они активны, другой цвет текста, когда они отключены, и другой вид рельефа, когда они нажаты. Команда style map задаёт динамические настройки параметров для определённого стиля:
ttk::style map TButton \
-background [list disabled #d9d9d9 active #ececec] \
-foreground [list disabled #a3a3a3] \
-relief [list {pressed !disabled} sunken] \
; См. также
ttk::widget, ttk::style
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/ttk_intro.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/ttk_intro.htm