Новость из категории: Информация

Знакомство с Tcl/Tk: обработка событий

Содержание:
1. Введение;
2. Первый пример;
3. Обработка событий (Вы читаете данный раздел);
4. Виджеты;
5. Темы и стили.
Знакомство с Tcl/Tk: обработка событий

Теперь займемся реальной логикой программы. Добавим к коду для кнопки обработчик ее нажатия:
ttk::button .add -text "Сложить" -command process

и напишем саму процедуру process:
proc process {} {
tk _ messageBox -message "Сумма равна J
[expr [.fr.num1 get] + [.fr.num2 get]]"
}

Теперь при нажатии на кнопку отображается диалоговое окно с сумой двух чисел. Команда поля ввода get возвращает его текущее значение, однако этот способ получения значения не совсем в духе Tk. В Tk к полю ввода (и к многим другим виджетам) можно «привязать» переменную, которая будет автоматически менять свое значение, когда текст в поле меняется:

ttk::entry .fr.num1 -textvariable var1
ttk::entry .fr.num2 -textvariable var2

proc process {} {
tk _ messageBox -message "Сумма равна [expr $::var1+$::var2]"
}

Важно помнить, что все переменные в процедурах локальны. Чтобы получить значение глобальной переменной, нужно явно указать глобальное пространство имен ($::var1, а не просто $var1). Связь поля ввода с переменной двусторонняя - как только меняется значение переменной, обновляется текст в поле. Так можно программно устанавливать нужное значение.

Знакомство с Tcl/Tk: обработка событий

В приведенном выше способе мы назначили обработчик события для кнопки неявно командой -command. Это самый удобный способ в случае кнопок и некоторых других виджетов, для которых определены «естественные» для них события (для кнопки это нажатие левой кнопки мыши). Однако в Tk есть возможность работать с разнообразными событиями напрямую. Например, можно выводить сумму наших чисел, когда пользователь щелкает по кнопке правой кнопкой мыши, добавив в конце нашей программы строку:
bind .add <Button-3> process

Команда bind принимает виджет, тип события в угловых скобках и скрипт, выполняемый в ответ на него. Детали синтаксиса событий несколько запутанны, но концептуально все очень просто. Для некоторых событий имеются параметры, передаваемые в обработчик. Для движения мыши это ее координаты, для нажатия клавиши - ее код и т.п. Такие параметры передаются с помощью специальных подстановочных символов, начинающихся со знака «%» и ведущих себя как переменные с областью видимости, ограниченной конкретной командой bind. Например, так можно постоянно заполнять наши поля ввода координатами мыши относительно основного окна:
bind . <Motion> {set var1 %x; set var2 %y}

Многие виджеты определяют так называемые виртуальные события. Ими могут быть, например, операции Undo и Redo в текстовом редакторе. Синтаксис для виртуальных событий ничем не отличается от обычного, кроме того, что они записываются в двойных угловых скобках. Это дает огромную гибкость и возможность создания очень сложных виджетов с удивительно простым API.

Рейтинг статьи

Оценка
4/5
голосов: 6
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх