События

В системе современного графического интерфейса имеется возможность отслеживать различные события, связанные с клавиатурой и мышью, и происходящие на «территории» того или иного виджета. В Tk события описываются в виде текстовой строки — шаблона события, состоящего из трех элементов (модификаторы, тип события и детализация события).

Тип события Содержание события Activate Активизация окна ButtonPress Нажатие кнопки мыши ButtonRelease Отжатие кнопки мыши Deactivate Деактивация окна Destroy Закрытие окна Enter Вхождение курсора в пределы виджета FocusIn Получение фокуса окном FocusOut Потеря фокуса окном KeyPress Нажатие клавиши на клавиатуре KeyRelease Отжатие клавиши на клавиатуре Leave Выход курсора за пределы виджета Motion Движение мыши в пределах виджета MouseWheel Прокрутка колесика мыши Reparent Изменение родителя окна Visibility Изменение видимости окна

Примеры описаний событий строками и некоторые названия клавиш приведены ниже:

"<ButtonPress–3>" или просто "<3>" — щелчок правой кнопки мыши (то есть, третьей, если считать на трехкнопочной мыши слева–направо). "<Shift–Double–Button–1>" — двойной щелчок мышью (левой кнопкой) с нажатой кнопкой Shift. В качестве модификаторов могут быть использованы следующие (список неполный):

Control, Shift, Lock,

Button1–Button5 или B1–B5,

Meta, Alt, Double, Triple.

Просто символ обозначает событие — нажатие клавиши. Например, «k» — тоже, что "<KeyPress–k>". Для неалфавитно–цифровых клавиш есть специальные названия:

Cancel, BackSpace, Tab, Return, Shift_L, Control_L, Alt_L,

Pause, Caps_Lock, Escape, Prior, Next, End, Home, Left,

Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7,

F8, F9, F10, F11, F12, Num_Lock, Scroll_Lock, space, less

Здесь <space> обозначает пробел, а <less> — знак меньше. <Left>, <Right>, <Up>, <Down> — стрелки. <Prior>, <Next> — это PageUp и PageDown. Остальные клавиши более или менее соответствуют надписям на стандартной клавиатуре.

Примечание:

Следует заметить, что Shift_L, в отличие от Shift, нельзя использовать как модификатор.

В конкретной среде комбинации, означающие что–то особенное в системе, могут не дойти до графического приложения. Например, известный всем Ctrl–Alt–Del.

Следующая программа позволяет печатать направляемые виджету события, в частности — keysym, а также анализировать, как различные клавиши можно представить в шаблоне события:

from Tkinter import *

tk = Tk()      # основное окно приложения

txt = Text(tk) # текстовый виджет, принадлежащий окну tk

txt.pack()     # располагается менеджером pack

# функция обработки события

def event_info(event):

 txt.delete("1.0", END) # удаляется с начала до конца текста

 for k in dir(event):   # цикл по атрибутам события

  if k[0] != "_":       # берутся только неслужебные атрибуты

   # готовится описание атрибута события

   ev = "%15s: %s " % (k, repr(getattr(event, k)))

   txt.insert(END, ev)  # добавляется в конец текста

# привязывается виджету txt функция event_info для обработки событий,

# соответствующих шаблону <KeyPress>

txt.bind("<KeyPress>", event_info)

tk.mainloop() # главный цикл обработки событий

При нажатии клавиши Esc в окне можно увидеть примерно следующее:

      char: 'x1b'

     delta: 9

    height: 0

   keycode: 9

    keysym: 'Escape'

keysym_num: 65307

       num: 9

send_event: False

    serial: 159

     state: 0

      time: -1072960858

      type: '2'

    widget: <Tkinter.Text instance at 0x401e268c>

     width: 0

         x: 83

    x_root: 448

         y: 44

    y_root: 306

Следует объяснить некоторые из этих атрибутов:

• char Нажатый символ (для некоторых событий — ??)

• height, width Высота и ширина.

• focus Был ли в момент события фокус у окна?

• keycode Код символа (скан–код клавиатуры).

• keysym Символическое имя клавиши.

• serial Серийный номер события. Увеличивается по мере возникновения событий.

• time Время возникновения события. Все время увеличивается.

• widget Виджет, в котором возникло событие.

• x, y Координаты указателя в виджете во время события.

• x_root, y_root Координаты указателя на экране во время события.

В принципе, совсем необязательно, чтобы события обрабатывал тот же виджет, который их первично принял. Например, можно перенаправить все события внутри подчиненных виджетов на данный виджет с помощью метода grab_set() (grab_release() освобождает виджет от этой обязанности). В Tk существуют и другие возможности управления событиями, которые можно изучить по документации.

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ