РЕКОМЕНДАЦИИ ПО ПРОГРАММИРОВАНИЮ НА TCL/TK

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.

СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТА Создать какой-либо виджет довольно просто, для этого нужно вызвать команду создания и указать имя и необходимые дополнительные параметры.

К командам создания относятся:

frame — создать область на окне
label — создать текстовую метку (однострочная)
message — создать текстовую метку (многострочная)
button — создать кнопку
listbox — создать список
scrollbar — создать полосу прокрутки
scale — создать “ползунок”
entry — создать поле ввода
menu — создать меню
menubutton — создать элемент меню
canvas — создать поле графического вывода
Например, для создания кнопки с текстом “Выход” необходимо выполнить команду:

button .b_exit -text Выход
 

button — тип создаваемого объекта,
.b_exit — имя объекта
-text Выход — текст, выводимый на кнопке.
Уничтожение объектов производиться командой destroy, причем вместе с родительским объектом уничтожаются все производные от него объекты.

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.


 

Рисунок 4

Рисунок 5

Существую и другие опции команды pack.
 

СОБЫТИЯ Обработка событий, связанных с объектом, происходит путем вызова процедур, которые указываются при инициализации или с помощью команд bind и tkerror.

У многих виджетов имеется событие, которое связано с ним по умолчанию. Так, у кнопки это событие, которое генерируется при ее нажатии. Процедуру обработки таких событий можно задать при создании объекта (опция -command) или путем модификации этой опции. Например:
 

button .ok -text Выполнить -command on_press_okили button .ok -text Выполнить .ok configure -command on_press_okгде on_press_ok имя процедуры обработки события — нажатие на кнопку. Синтаксис языка Tcl дает возможность вместо имени процедуры написать тело процедуры:
  button .ok -text Выполнить -command { puts "Нажата кнопка Выполнить”}Также можно менять обработчик события по ходу выполнения программы, в зависимости от требований задачи или определенной ситуации (используют опцию configure).

Для связывания какого либо события с процедурой обработки существует команда bind. Для связывания события и процедуры реакции на это событие, необходимо выполнить команду bindс указанием окна, к которому должно оно относится.

Ниже приведен список событий, которые генерируются системой:

Key или KeyPress клавишу нажали
KeyRelease клавишу отпустили
Button или ButtonPress кнопку “Мыши” нажали
ButtonRelease  кнопку “Мыши” отпустили
Enter указатель курсора переместился в область виджета
Leave указатель курсора покинул область виджета
Motion указатель курсора переместился в другое место
Существует еще один тип события, это событие ошибки системы X Window. Процедуру обработки указывают с помощью команды tkerror.

При связывании события и процедуры можно указать уточнение, к какому элементу устройства должно относиться событие (левая или правая кнопка “Мыши”, клавиша Ctrl и т.д.).Существую следующие модификаторы:

Contol — клавиша Ctrl
Shift — клавиша Shift
Lock — клавиша фиксации клавиатуры
Button1, B1 — первая кнопка “Мыши”
Button2, B2 — вторая кнопка “Мыши”
Button3, B3 — третья кнопка “Мыши”
Button4, B4 — четвертая кнопка “Мыши”
Button5, B5 — пятая кнопка “Мыши”
Any — любой символ
Double — двойное нажатие кнопки
Triple — тройное нажатие кнопки
Mod1, M1, Meta, M — назначенная клавиша средствами X Windows
Mod2, M2, Alt — назначенная клавиша средствами X Windows
Mod3, M3 назначенная клавиша средствами X Windows
Mod4, M4 назначенная клавиша средствами X Windows
Mod5, M5 назначенная клавиша средствами X Windows
Например, команда bind .w <B3-ButtonRelease> do_help
при нажатии правую кнопку на манипуляторе “Мышь” вызовет процедуру do_help.


При вызове процедуры в качестве параметров можно указать значения специфичных параметров события — такие как координаты указателя манипулятора “Мышь”, код клавиши и другие.