Изначально пакет Tcl/Tk создавался для разработки интерфейса в графической среде X Window System. Поэтому концепция программирования на Tcl/Tk построена на программировании в этой среде с использованием базового элемента — библиотеки разработки пользовательского интерфейса Motif.
Другим базовым элементов, на котором основан Tcl/Tk, это менеджер окон, который входит в состав стандартной графической среды операционной системы.
При этом менеджер окон отвечает за управление окнами на рабочем пространстве экрана (открытие, закрытие, перемещение и т. д.), а интерфейс программирования Motif за объекты, находящиеся внутри окон.
Для программиста, разрабатывающего на Tcl/Tk, оба эти элемента объединены в одно целое и работают вместе.
Одним из основных элементов системы программирования, является так называемый
виджет (widget). Виджет — это объект со своими свойствами и внешним
представлением. Например, кнопка, поле ввода или полоса прокрутки. Каждый виджет
является объектом графической среды X Window, и является, по своей сути,
“окном”. Каждый виджет может иметь набор связанных с ним других виджетов, а так
же входить в другой набор, относящийся к родительскому, главному виджету. Таким
образом, получается дерево объектов-виджетов
(см. Рисунок
1).
Следует заметить, что только главное окно имеет средства управления (перемещения, изменение размера и т.д.). Поэтому в Tcl/Tk введена возможность создавать новые главные дополнительные подокна (toplevel), причем их имена будут состоять из знака “.” и имени, например, .dialog.
Рисунок 1
Процесс написания программы с применением виджетов сводится к написанию двух частей кода — инициализации и обработке событий. Код инициализации выполняется, когда приложение стартует. При этом выполняются создание объектов, загрузка данных и другие действия инициализации.
Создав необходимые объекты, программа автоматически переходит в состояние ожидания событий. Событие — это сигнал, который формирует операционная система и говорит, что в ней что-то произошло, например, нажали на кнопку манипулятора “Мышь” или на клавиатуре нажали клавишу, или какое-либо другое событие.
Для каждого виджета можно описать действия, которые необходимо выполнить при появлении нужного события. Например, при нажатии кнопки “Загрузка”, произвести загрузку файла или какую-либо другую операцию.
То есть, создав необходимые объекты и описав их поведение при возникновении определенных событий, мы получим действующую программу.
Однако, как было сказано выше, очень часто бывает необходимо создать диалоговое окно, которое независимо от главного. Для этого использую команду toplevel. Имя этого окна должно состоять из точки и имени (.message). Для смены фокуса ввода (перевести созданное окно или любое другое в активное состояние) необходимо использовать команду focus.
К командам создания относятся:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
Рисунок 3
Опция -fill pack .ok .cancel .help. -side top -fill x ( Рисунок 3) определяет, нужно ли растягивать объекты на всю длину/ширину окна. Сравните окна на Рисунках 4 и 5.
Рисунок 4
Рисунок 5
Существую и другие опции команды pack.
У многих виджетов имеется событие, которое связано с ним по умолчанию. Так, у
кнопки это событие, которое генерируется при ее нажатии. Процедуру обработки
таких событий можно задать при создании объекта (опция -command) или путем
модификации этой опции. Например:
Для связывания какого либо события с процедурой обработки существует команда bind. Для связывания события и процедуры реакции на это событие, необходимо выполнить команду bindс указанием окна, к которому должно оно относится.
Ниже приведен список событий, которые генерируются системой:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При связывании события и процедуры можно указать уточнение, к какому элементу устройства должно относиться событие (левая или правая кнопка “Мыши”, клавиша Ctrl и т.д.).Существую следующие модификаторы:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При вызове процедуры в качестве параметров можно указать значения
специфичных параметров события — такие как координаты указателя манипулятора
“Мышь”, код клавиши и другие.