Главная


54.6. Написание обработчика: Класс Event

В приведенных выше разделах рассказывалось о том, как описать события, которые вы хотите обрабатывать, и как их связать. Теперь перейдем к написанию обработчика, который будет вызван, когда событие действительно произойдет.

Обработчику будет передан объект 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.


>> Трюк с дополнительными аргументами