Знакомство с Tcl/Tk: обработка событий
Содержание:
1. Введение;
2. Первый пример;
3. Обработка событий (Вы читаете данный раздел);
4. Виджеты;
5. Темы и стили.
Теперь займемся реальной логикой программы. Добавим к коду для кнопки обработчик ее нажатия:
и напишем саму процедуру process:
Теперь при нажатии на кнопку отображается диалоговое окно с сумой двух чисел. Команда поля ввода get возвращает его текущее значение, однако этот способ получения значения не совсем в духе Tk. В Tk к полю ввода (и к многим другим виджетам) можно «привязать» переменную, которая будет автоматически менять свое значение, когда текст в поле меняется:
Важно помнить, что все переменные в процедурах локальны. Чтобы получить значение глобальной переменной, нужно явно указать глобальное пространство имен ($::var1, а не просто $var1). Связь поля ввода с переменной двусторонняя - как только меняется значение переменной, обновляется текст в поле. Так можно программно устанавливать нужное значение.
В приведенном выше способе мы назначили обработчик события для кнопки неявно командой -command. Это самый удобный способ в случае кнопок и некоторых других виджетов, для которых определены «естественные» для них события (для кнопки это нажатие левой кнопки мыши). Однако в Tk есть возможность работать с разнообразными событиями напрямую. Например, можно выводить сумму наших чисел, когда пользователь щелкает по кнопке правой кнопкой мыши, добавив в конце нашей программы строку:
Команда bind принимает виджет, тип события в угловых скобках и скрипт, выполняемый в ответ на него. Детали синтаксиса событий несколько запутанны, но концептуально все очень просто. Для некоторых событий имеются параметры, передаваемые в обработчик. Для движения мыши это ее координаты, для нажатия клавиши - ее код и т.п. Такие параметры передаются с помощью специальных подстановочных символов, начинающихся со знака «%» и ведущих себя как переменные с областью видимости, ограниченной конкретной командой bind. Например, так можно постоянно заполнять наши поля ввода координатами мыши относительно основного окна:
Многие виджеты определяют так называемые виртуальные события. Ими могут быть, например, операции Undo и Redo в текстовом редакторе. Синтаксис для виртуальных событий ничем не отличается от обычного, кроме того, что они записываются в двойных угловых скобках. Это дает огромную гибкость и возможность создания очень сложных виджетов с удивительно простым API.
1. Введение;
2. Первый пример;
3.
4. Виджеты;
5. Темы и стили.
Теперь займемся реальной логикой программы. Добавим к коду для кнопки обработчик ее нажатия:
ttk::button .add -text "Сложить" -command process
и напишем саму процедуру process:
proc process {} {
tk _ messageBox -message "Сумма равна J
[expr [.fr.num1 get] + [.fr.num2 get]]"
}
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]"
}
ttk::entry .fr.num1 -textvariable var1
ttk::entry .fr.num2 -textvariable var2
…
proc process {} {
tk _ messageBox -message "Сумма равна [expr $::var1+$::var2]"
}
Важно помнить, что все переменные в процедурах локальны. Чтобы получить значение глобальной переменной, нужно явно указать глобальное пространство имен ($::var1, а не просто $var1). Связь поля ввода с переменной двусторонняя - как только меняется значение переменной, обновляется текст в поле. Так можно программно устанавливать нужное значение.
В приведенном выше способе мы назначили обработчик события для кнопки неявно командой -command. Это самый удобный способ в случае кнопок и некоторых других виджетов, для которых определены «естественные» для них события (для кнопки это нажатие левой кнопки мыши). Однако в Tk есть возможность работать с разнообразными событиями напрямую. Например, можно выводить сумму наших чисел, когда пользователь щелкает по кнопке правой кнопкой мыши, добавив в конце нашей программы строку:
bind .add <Button-3> processКоманда bind принимает виджет, тип события в угловых скобках и скрипт, выполняемый в ответ на него. Детали синтаксиса событий несколько запутанны, но концептуально все очень просто. Для некоторых событий имеются параметры, передаваемые в обработчик. Для движения мыши это ее координаты, для нажатия клавиши - ее код и т.п. Такие параметры передаются с помощью специальных подстановочных символов, начинающихся со знака «%» и ведущих себя как переменные с областью видимости, ограниченной конкретной командой bind. Например, так можно постоянно заполнять наши поля ввода координатами мыши относительно основного окна:
bind . <Motion> {set var1 %x; set var2 %y}Многие виджеты определяют так называемые виртуальные события. Ими могут быть, например, операции Undo и Redo в текстовом редакторе. Синтаксис для виртуальных событий ничем не отличается от обычного, кроме того, что они записываются в двойных угловых скобках. Это дает огромную гибкость и возможность создания очень сложных виджетов с удивительно простым API.