События
В системе современного графического интерфейса имеется
возможность отслеживать различные события, связанные с клавиатурой и
мышью, и происходящие на «территории» того или иного виджета. В Tk
события описываются в виде текстовой строки — шаблона события,
состоящего из трех элементов (модификаторы, тип события и детализация
события).Тип события | Содержание события |
---|---|
Activate |
Активизация окна |
ButtonPress |
Нажатие кнопки мыши |
ButtonRelease |
Отжатие кнопки мыши |
Deactivate |
Деактивация окна |
Destroy |
Закрытие окна |
Enter |
Вхождение курсора в пределы виджета |
FocusIn |
Получение фокуса окном |
FocusOut |
Потеря фокуса окном |
KeyPress |
Нажатие клавиши на клавиатуре |
KeyRelease |
Отжатие клавиши на клавиатуре |
Leave |
Выход курсора за пределы виджета |
Motion |
Движение мыши в пределах виджета |
MouseWheel |
Прокрутка колесика мыши |
Reparent |
Изменение родителя окна |
Visibility |
Изменение видимости окна |
""
или просто "<3>"3>
— щелчок правой кнопки мыши (то есть, третьей, если считать на трехкнопочной мыши слева–направо). ""
— двойной щелчок мышью (левой кнопкой) с нажатой кнопкой Shift. В
качестве модификаторов могут быть использованы следующие (список
неполный):Control
, Shift
, Lock
,Button1
–Button5
или B1
–B5
,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 существуют и другие
возможности управления событиями, которые можно изучить по документации.
Комментариев нет:
Отправить комментарий