-
Tcl/Tk — это инструмент программирования на языке Tcl, позволяющий создавать приложения с графическим интерфейсом.
Изначально пакет Tcl/Tk создавался для разработки интерфейса в графической среде X Window System. Поэтому концепция программирования на Tcl/Tk построена на программировании в этой среде с использованием базового элемента — библиотеки разработки пользовательского интерфейса Motif.
Другим базовым элементов, на котором основан Tcl/Tk, это менеджер окон, который входит в состав стандартной графической среды операционной системы.
При этом менеджер окон отвечает за управление окнами на рабочем пространстве экрана (открытие, закрытие, перемещение и т. д.), а интерфейс программирования Motif за объекты, находящиеся внутри окон.
Для программиста, разрабатывающего на Tcl/Tk, оба эти элемента объединены в одно целое и работают вместе.
Одним из основных элементов системы программирования, является так называемый виджет (widget). Виджет — это объект со своими свойствами и внешним представлением. Например, кнопка, поле ввода или полоса прокрутки. Каждый виджет является объектом графической среды X Window, и является, по своей сути, “окном”. Каждый виджет может иметь набор связанных с ним других виджетов, а так же входить в другой набор, относящийся к родительскому, главному виджету. Таким образом, получается дерево объектов-виджетов
(см. Рисунок 1).
-
Каждому виджету соответствует имя, например, .a.b.c. Это имя отражает ту “ветвь дерева”, где оно находится. Например, виджеты .a.b.c и a.b.d входят в набор объектов относящихся к виджету a.b, а виджет с именем a.e входит в группу объектов, относящихся как к объекту .a, как и объект a.b. Виджет с именем “.”, является главным объектом-окном приложения.
Следует заметить, что только главное окно имеет средства управления (перемещения, изменение размера и т.д.). Поэтому в Tcl/Tk введена возможность создавать новые главные дополнительные подокна (toplevel), причем их имена будут состоять из знака “.” и имени, например, .dialog.
Рисунок 1
Процесс написания программы с применением виджетов сводится к написанию двух частей кода — инициализации и обработке событий. Код инициализации выполняется, когда приложение стартует. При этом выполняются создание объектов, загрузка данных и другие действия инициализации.
Создав необходимые объекты, программа автоматически переходит в состояние ожидания событий. Событие — это сигнал, который формирует операционная система и говорит, что в ней что-то произошло, например, нажали на кнопку манипулятора “Мышь” или на клавиатуре нажали клавишу, или какое-либо другое событие.
Для каждого виджета можно описать действия, которые необходимо выполнить при появлении нужного события. Например, при нажатии кнопки “Загрузка”, произвести загрузку файла или какую-либо другую операцию.
То есть, создав необходимые объекты и описав их поведение при возникновении определенных событий, мы получим действующую программу.
-
При старте графической оболочки Tcl/Tk автоматически создается главное окно приложения с именем “.” и в нем можно сразу располагать новые объекты.
Однако, как было сказано выше, очень часто бывает необходимо создать диалоговое окно, которое независимо от главного. Для этого использую команду toplevel. Имя этого окна должно состоять из точки и имени (.message). Для смены фокуса ввода (перевести созданное окно или любое другое в активное состояние) необходимо использовать команду focus.
-
Создать какой-либо виджет довольно просто, для этого нужно вызвать команду создания и указать имя и необходимые дополнительные параметры.
К командам создания относятся:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
Например, для создания кнопки с текстом “Выход” необходимо выполнить команду:
button .b_exit -text Выход
-
button —тип создаваемого объекта,
.b_exit —имя объекта
-text Выход— текст, выводимый на кнопке.
destroy .b_exit
-
Создание объектов, которые должны использоваться в окне диалога, еще не означает их появления на рабочем экране. Для того, чтобы отобразить их на экране, необходимо их расположить в родительском окне.
Для этой цели служат команды packи place.
По именам этих команд видно, что команда packупаковывает выводимые объекты в родительском окне, а команда place располагает их по заданным координатам.
Наибольшей популярностью пользуется команда pack, так как при изменении размеров главного окна, объекты равномерно распределяются по окну согласно заданным порядку и размерам. Программисту нет необходимости задумываться о координатах объектов.
Команда packимеет простой синтаксис, но на опциях side и fill необходимо остановиться подробнее. Они указывают, где и как размещать объект.
Рисунок 2
Опция -side. На примере (см. Рисунок 2 а) показан, результат выполнение команды pack .ok .cancel .help. -side left. Если во время выполнения программы растянуть окно, то оно будет выглядеть как на Рисунке 2b.
-
Если опцию -side leftзаменить на -side top,то оно будет выглядеть как на Рисунке 2c.
Рисунок 3
Опция -fill pack .ok .cancel .help. -side top -fill x ( Рисунок 3) определяет, нужно ли растягивать объекты на всю длину/ширину окна. Сравните окна на Рисунках 4 и 5.
СОБЫТИЯ
-
Обработка событий, связанных с объектом, происходит путем вызова процедур, которые указываются при инициализации или с помощью команд bindи tkerror.
У многих виджетов имеется событие, которое связано с ним по умолчанию. Так, у кнопки это событие, которое генерируется при ее нажатии. Процедуру обработки таких событий можно задать при создании объекта (опция -command) или путем модификации этой опции. Например:
-
button .ok -text Выполнить -command on_press_ok
-
button .ok -text Выполнить .ok configure -command on_press_ok
-
button .ok -text Выполнить -command {
-
puts "Нажата кнопка Выполнить”
Для связывания какого либо события с процедурой обработки существует команда bind. Для связывания события и процедуры реакции на это событие, необходимо выполнить команду bindс указанием окна, к которому должно оно относится.
Ниже приведен список событий, которые генерируются системой:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
Существует еще один тип события, это событие ошибки системы X Window. Процедуру обработки указывают с помощью команды tkerror.
При связывании события и процедуры можно указать уточнение, к какому элементу устройства должно относиться событие (левая или правая кнопка “Мыши”, клавиша Ctrl и т.д.).Существую следующие модификаторы:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
Например, команда
-
bind .w
при нажатии правую кнопку на манипуляторе “Мышь” вызовет процедуру do_help.
При вызове процедуры в качестве параметров можно указать значения специфичных параметров события — такие как координаты указателя манипулятора “Мышь”, код клавиши и другие.