Материал из Tkabber Wiki
Содержание
Введение
База данных опций Tk ("Tk option database") это набор пар строк
ключ/значение
, присутствующих в любом интерпретаторе Tcl, загрузившем
библиотеку Tk, независимо от платформы, позволяющая весьма гибко задавать
настройки для различных виджетов, составляющих графический интерфейс
пользователя программы.
База данных опций Tk имеет прямое отношение к XRDB (и инициализируется из неё на тех платформах, на которых та доступна), работает очень похожим образом, однако имеет некоторые тонкие отличия.
Глоссарик (словарий)
Начнём с определения необходимых терминов.
Виджеты
Слово "ви́джет" является калькой с английского "widget", которое является хитрым объединением слов "window" (окно) и "gadget" (штуковина, хреновина, прибор, девайс и т.п.). Появилось в X Window и обозначает элемент графического пользовательского интерфейса, представленный окном и обладающий определённым набором свойств и поведением. Виндовые программисты обычно назвают виджеты "контро́лами" ("control", "windowed control").
Говоря проще, виджетами являются все чётко выделяемые пользователем элементы интерфейса: кнопки, поля ввода, скроллбары и т.п. Мнение википедии по этому вопросу изложено тут.
Для нас важнее всего понять два свойства виджетов Tk:
- Виджеты Tk организованы иерархически. То есть некоторые виджеты могут содержать дочерние виджеты и сами, в свою очередь, могут являться чьими-то дочерними виджетами. Строго говоря, все виджеты графического интерфейса пользователя организованы в виде однонаправленного ациклического графа — дерева. Корневым узлом этого графа является главное окно Tk.
- Каждый виджет в Tk имеет имя, которое однозначно определяет положение виджета в иерархии виджетов. Оно аналогично полному путевому имени файла в операционных системах. Имя виджета состоит из имён всех его родительских виджетов, разделённых точками ("."). Именем главного окна является точка (".")1.
Примеры имён виджетов:
.
— главное окно приложения;.roster
— окно списка контактов;.mainframe.topf.tb0.bbox
— контейнер с кнопками главного (и единственного) тулбара.
Имена виджетов обязаны подчиняться двум правилам:
- Имена виджетов должны быть полными (так как в отличие, к примеру, от командных оболочек операционных систем, в программах, использующих Tk, нет концепции "текущий виджет", аналогичной концепции "текущего каталога"), — то есть они должны начинаться с точки;
- Имя каждого виджета в цепочке, составляющей полное имя, обязано начинаться со строчной буквы или цифры2 — заглавные буквы зарезервированы за классами виджетов.
Классы виджетов
Каждый виджет принадлежит к определённому классу. Так же, как в некоторых объектно-ориентированных языках программирования класс реализует (обозначает) тип объекта, класс виджета определяет тип этого виджета — поведение и набор характеристик, общих для всех виджетов данного класса.
Примеры классов:
Button
— кнопка;Entry
— однострочное поле ввода;Menu
— меню;Frame
— "фрейм" (окно, чьей единственной задачей обычно является хранение дочерних окон и управление их взаимным расположением (их "геометрией")).
Имена классов стандартных для Tk виджетов просто и однозначно связаны с командами Tcl, предоставляемыми Tk для создания этих виджетов: команды назваются так же, как классы, но отличаются от них строчной "капитализацией", например:
Button
→button
Labelframe
→labelframe
и т.д.
Имена классов виджетов в Tk всегда начинаются с заглавной буквы. Это нужно для того, чтобы можно было отличать их от имён конкретных виджетов в спецификациях запросов к базе данных опций Tk, которые будут объяснены ниже.
Нетрудно видеть, что можно взять имя любого виджета и заменить имя каждого (родительского) виджета в цепочке его классом. Например, для первой (слева) кнопки на нашем тулбаре, которая имеет имя
.mainframe.topf.tb0.bbox.b0
это будет:
Tkabber.Frame.Frame.Frame.ButtonBox.Button
что соответствует такой таблице:
Виджет | Класс |
---|---|
. | Tkabber |
.mainframe | Frame |
.mainframe.topf | Frame |
.mainframe.topf.tb0 | Frame |
.mainframe.topf.tb0.bbox | ButtonBox |
.mainframe.topf.tb0.bbox.b0 | Button |
Обратите внимание на класс основного окна (".") — он имеет значение "Tkabber" и вообще говоря совпадает с именем приложения, о котором подробно рассказано ниже.
Примечание: класс виджета можно узнать при помощи команды winfo:
winfo class .path.to.the.widget
Опции виджетов
Внешний вид и поведение виджетов контролируется их опциями. Свои опции виджеты получают от своих классов, например, все кнопки (виджеты класса Button) имеют совершенно одинаковый набор опций. Значения же этих опций обычно разные, что и делает разные виджеты одного класса выглядящими и ведущими себя по-разному (сравните, к примеру, кнопку на тулбаре с кнопкой, закрывающей окно "О программе").
Опции виджетов тоже имеют имена. Эти имена как бы продолжают иерархию виджетов ещё на один уровень, например, имя опции, определяющей шрифт текста на нашей многострадальной кнопке тулбара таково:
.mainframe.topf.tb0.bbox.b0.font
Откуда виджеты берут значения своих опций?
Виджеты Tk получают свои параметры (то есть значения своих опций) из трёх источников, перечисленных ниже, в указанном порядке:
- Значения по умолчанию, "прибитые гвоздями" в библиотеку Tk;
- Значения из базы данных опций Tk;
- Значения, динамически присваемые опциям в ходе выполнения программы.
Нетрудно видеть, что параметры по умолчанию имеют самый низкий приоритет, а значения, которые опции виджета получают в ходе выполнения программы имеют максимальный приоритет.
Важно понимать, что первые два источника являются "статичными" в том смысле, что Tk пользуется ими только при создании виджета.
Классы опций виджетов
Да, опции виджетов тоже имеют классы.
Сделать: развить
Структура
База данных опций Tk отображает...
Сделать: развить
Подводные камни
Имя приложения
Сделать: написать
Примечания
1 В именовании виджетов Tk используется тот же "трюк" (или "то же несоответствие", если угодно), которое присутствует в файловых системах Unix: в последних именем корневого каталога является "/", и этот же символ является разделителем имён в пути, однако в путевых именах файлов именем корневого каталога является пустая строка, а путевое имя начинается с разделителя:
/ — корневой каталог
/foo/bar.txt — путевое имя файла bar.txt в каталоге /foo
^разделитель
Нетрудно видеть, что в именах виджетов Tk то же самое происходит с символом ".": он одновременно является именем главного окна и разделителем частей имени виджета, поэтому в именах виджетов именем главного окна является пустая строка, а имя начинается с разделителя:
. — главное окно
.mywindow.mybutton — виджет mybutton в окне .mywindow
^разделитель
2 Строго говоря, в имени виджета можно использовать любой допустимый символ Unicode, кроме заглавных символов и точки. Например, вполне допустим код:
label .метко
pack .метко
.метко config -text {Медведы идут на udaff.com}
Более того, имена виджетов могут содержать пробелы:
label ". " ;# метка с именем, состоящим из одного пробела
Понятно, что как по причинам читабельности, так и удобства программирования/поддержки кода, так делать не стоит. Кроме того, в руководствах по Tk этот вопрос практически не освещён, а значит, ничего особо не гарантируется. Также совершенно непонятен вопрос взамодействия таких имён виджетов с базой данных опций Tk и — главное — взаимодействие последней с XRDB.