Spec-Zone.ru › Tcl/Tk

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API