понедельник, 25 декабря 2017 г.

Создание графических приложений. События

События

В системе современного графического интерфейса имеется возможность отслеживать различные события, связанные с клавиатурой и мышью, и происходящие на «территории» того или иного виджета. В Tk события описываются в виде текстовой строки — шаблона события, состоящего из трех элементов (модификаторы, тип события и детализация события).
Тип события Содержание события
Activate Активизация окна
ButtonPress Нажатие кнопки мыши
ButtonRelease Отжатие кнопки мыши
Deactivate Деактивация окна
Destroy Закрытие окна
Enter Вхождение курсора в пределы виджета
FocusIn Получение фокуса окном
FocusOut Потеря фокуса окном
KeyPress Нажатие клавиши на клавиатуре
KeyRelease Отжатие клавиши на клавиатуре
Leave Выход курсора за пределы виджета
Motion Движение мыши в пределах виджета
MouseWheel Прокрутка колесика мыши
Reparent Изменение родителя окна
Visibility Изменение видимости окна
Примеры описаний событий строками и некоторые названия клавиш приведены ниже:
"" или просто "<3>" — щелчок правой кнопки мыши (то есть, третьей, если считать на трехкнопочной мыши слева–направо). "" — двойной щелчок мышью (левой кнопкой) с нажатой кнопкой Shift. В качестве модификаторов могут быть использованы следующие (список неполный):
Control, Shift, Lock,
Button1Button5 или B1B5,
Meta, Alt, Double, Triple.
Просто символ обозначает событие — нажатие клавиши. Например, «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
Здесь обозначает пробел, а  — знак меньше. , , ,  — стрелки. ,  — это 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\n" % (k, repr(getattr(event, k)))
   txt.insert(END, ev)  # добавляется в конец текста

# привязывается виджету txt функция event_info для обработки событий,
# соответствующих шаблону
txt.bind("", 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:
     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 существуют и другие возможности управления событиями, которые можно изучить по документации.

Комментариев нет:

Отправить комментарий

Анализ кода

Профилирование и отладка Python Профилирование и отладка Python, переходим к практике Профилирование и отладка Python, инструменты Профил...