Tkabber Wiki

База данных опций Tk
Login

Материал из Tkabber Wiki

Содержание

Введение

База данных опций Tk ("Tk option database") это набор пар строк ключ/значение, присутствующих в любом интерпретаторе Tcl, загрузившем библиотеку Tk, независимо от платформы, позволяющая весьма гибко задавать настройки для различных виджетов, составляющих графический интерфейс пользователя программы.

База данных опций Tk имеет прямое отношение к XRDB (и инициализируется из неё на тех платформах, на которых та доступна), работает очень похожим образом, однако имеет некоторые тонкие отличия.

Глоссарик (словарий)

Начнём с определения необходимых терминов.

Виджеты

Слово "ви́джет" является калькой с английского "widget", которое является хитрым объединением слов "window" (окно) и "gadget" (штуковина, хреновина, прибор, девайс и т.п.). Появилось в X Window и обозначает элемент графического пользовательского интерфейса, представленный окном и обладающий определённым набором свойств и поведением. Виндовые программисты обычно назвают виджеты "контро́лами" ("control", "windowed control").

Говоря проще, виджетами являются все чётко выделяемые пользователем элементы интерфейса: кнопки, поля ввода, скроллбары и т.п. Мнение википедии по этому вопросу изложено тут.

Для нас важнее всего понять два свойства виджетов Tk:

Примеры имён виджетов:

Имена виджетов обязаны подчиняться двум правилам:

Классы виджетов

Каждый виджет принадлежит к определённому классу. Так же, как в некоторых объектно-ориентированных языках программирования класс реализует (обозначает) тип объекта, класс виджета определяет тип этого виджета — поведение и набор характеристик, общих для всех виджетов данного класса.

Примеры классов:

Имена классов стандартных для Tk виджетов просто и однозначно связаны с командами Tcl, предоставляемыми Tk для создания этих виджетов: команды назваются так же, как классы, но отличаются от них строчной "капитализацией", например:

и т.д.

Имена классов виджетов в 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 получают свои параметры (то есть значения своих опций) из трёх источников, перечисленных ниже, в указанном порядке:

  1. Значения по умолчанию, "прибитые гвоздями" в библиотеку Tk;
  2. Значения из базы данных опций Tk;
  3. Значения, динамически присваемые опциям в ходе выполнения программы.

Нетрудно видеть, что параметры по умолчанию имеют самый низкий приоритет, а значения, которые опции виджета получают в ходе выполнения программы имеют максимальный приоритет.

Важно понимать, что первые два источника являются "статичными" в том смысле, что 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.