В приведенных выше разделах рассказывалось о том, как описать события, которые вы хотите обрабатывать, и как их связать. Теперь перейдем к написанию обработчика, который будет вызван, когда событие действительно произойдет.
Обработчику будет передан объект Event, описывающий произошедшее событие. Обработчик может быть как функцией, так и методом. Вот последовательность вызова обычной функции:
def handlerName(event):
И как метод:
def handlerName(self, event):
Атрибуты объекта Event, передаваемого обработчику, описаны ниже. Некоторые из этих атрибутов задаются всегда, а некоторые - только для определенных типов событий.
.char |
Если событие связано с нажатием (KeyPress) или отпусканием (KeyRelease) клавиши, которая выдает обычный ASCII-символ, то эта строка будет установлена на этот символ. (Для специальных клавиш, таких как Delete, см. атрибут .keysym, ниже.) |
.delta |
Для событий MouseWheel этот атрибут содержит целое число, знак которого положителен для прокрутки вверх и отрицателен для прокрутки вниз. В Windows это значение будет кратно 120; например, 120 означает прокрутку на один шаг вверх, а -240 - прокрутку на два шага вниз. В MacOS это значение будет кратно 1, поэтому 1 означает прокрутку вверх на один шаг, а -2 - прокрутку вниз на два шага. О поддержке колеса мыши в Linux см. примечание о привязке события Button в разделе 54.3, "Типы событий". |
.height |
Если событие было Configure, этот атрибут устанавливается на новую высоту виджета в пикселях. |
.keycode |
Для событий KeyPress или KeyRelease этот атрибут устанавливается в числовой код, идентифицирующий клавишу. Однако он не определяет, какие символы на этой клавише были произведены, так что "x" и "X" имеют одинаковое значение .keyCode. Возможные значения этого поля см. в разделе 54.5, "Имена клавиш". |
.keysym |
Для событий KeyPress или KeyRelease, связанных со специальной клавишей, этот атрибут устанавливается в строковое имя клавиши, например, 'Prior' для клавиши PageUp. Полный список имен .keysym см. в разделе 54.5, "Имена клавиш". |
.keysym_num |
Для событий KeyPress или KeyRelease устанавливается числовая версия поля .keysym. Для обычных клавиш, выдающих один символ, это поле устанавливается в целочисленное значение ASCII-кода клавиши. Для специальных ключей см. раздел 54.5, "Имена клавиш". |
.num |
Если событие было связано с кнопкой мыши, этот атрибут устанавливается в номер кнопки (1, 2 или 3). Для поддержки колеса мыши в Linux привяжите события Button-4 и Button-5; когда колесо мыши прокручивается вверх, это поле будет равно 4, а при прокрутке вниз - 5. |
.serial |
Целочисленный серийный номер, который увеличивается каждый раз, когда сервер обрабатывает клиентский запрос. Вы можете использовать значения .serial для определения точной временной последовательности событий: события с меньшими значениями произошли раньше. |
.state |
Целое число, описывающее состояние всех ключей-модификаторов. Интерпретацию этого значения см. в таблице масок модификаторов ниже. |
.time |
Этот атрибут устанавливается в целое число, которое не имеет абсолютного значения, но увеличивается каждую миллисекунду. Это позволяет вашему приложению определять, например, продолжительность времени между двумя кликами мыши. |
.type |
Числовой код, описывающий тип события. Интерпретацию этого кода см. в разделе 54.3, "Типы событий". |
.widget |
Всегда устанавливается на виджет, вызвавший событие. Например, если событие было кликом мыши, произошедшим на холсте, то этот атрибут будет соответствовать виджету Canvas. |
.width |
Если событие было Configure, этот атрибут будет установлен на новую ширину виджета в пикселях. |
.x |
Координата X мыши в момент события, относительно левого верхнего угла виджета. |
.y |
Координата Y мыши в момент события, относительно левого верхнего угла виджета. |
.x_root |
Координата X мыши в момент события, относительно левого верхнего угла экрана. |
.y_root |
Координата Y мыши в момент события, относительно левого верхнего угла экрана. |
Используйте эти маски для проверки битов значения .state, чтобы узнать, какие клавиши-модификаторы и кнопки были нажаты во время события:
| Маска | Модификатор |
|---|---|
0x0001 |
Shift |
0x0002 |
Caps Lock |
0x0004 |
Control |
0x0008 |
Левый Alt |
0x0010 |
Num Lock |
0x0080 |
Правый Alt |
0x0100 |
Кнопка мыши 1 |
0x0200 |
Кнопка мыши 2 |
0x0400 |
Кнопка мыши 3 |
Вот пример обработчика событий. В разделе 54.1, "Уровни привязки", выше, есть пример, показывающий, как привязать нажатие кнопки мыши 2 на холсте с именем self.canv к обработчику с именем self.__drawOrangeBlob(). Вот этот обработчик:
def __drawOrangeBlob(self, event):
'''Рисует оранжевый шар в self.canv там, где находится мышь.
'''
r = 5 # Радиус шара
self.canv.create_oval(event.x-r, event.y-r,
event.x+r, event.y+r, fill='orange')
Когда вызывается этот обработчик, текущая позиция мыши равна (event.x, event.y). Метод .create_oval() рисует окружность, ограниченную квадратом с центром на этой позиции и сторонами длиной r * 2.