Tkinter (44) 事件 Event
在我们的程序发生的一些情況, 我們称之事件, 将该事件及當时相关的参数, 连结到某个函数, 称为绑定, 当事件发生, 就会调用该函数. 事件有关的内容分为三大部份, 事件 event, 回调函数 callback 以及绑定 binding.
绑定的层级
- 绑定部件, 使用
bind()
方法 - 绑定部件类别, 使用
bind_class()
方法 - 绑定应用, 使用
bind_all()
方法
事件的序列 sequence
- 事件的序列以字符串表示, 内含单一或多个事件模式 pattern. 符合要求的事件, 必须所有的事件模式按照顺序都发生. 事件通常是标准的输入设备, 像键盘, 鼠标等.
- modifier 诸如组合按键, 例如 SHIFT, CTRL, ALT;
- type 可以是单一的事件, 如字母或按键名
- detail 说明细节, 比如鼠标的第 3 个按键
- 标准的事件序列格式, 说明如后.
<[modifier-]…type[-detail]>
- 例子
<Button-1> type:鼠标, detail:第一个按钮
<KeyPress-H> type:按键按下, detail:H 键
<Control-Shift-KeyPress-H> modifier:Control/Shift, type:按键按下, detail:H 键
- 简易表达方式
'<num>'
同'<Button-num>'
'x'
同'<KeyPress-x>'
(不适用空白键
及'<'
)
事件的类型 type
事件的类型有很多, 这里只提到一些常用的类型.
类型 | 名称 | 说明 |
---|---|---|
36 | Activate | 部件由停用变成可用 |
4 | Button | 鼠标键被按下, Linux 按键 4/5 为向上/下滚动 |
5 | ButtonRelease | 鼠标键被放开 |
22 | Configure | 部件的尺寸被改变 |
37 | Deactivate | 部件由可用变成停用 |
17 | Destroy | 部件正在被删除 |
7 | Enter | 鼠标移入部件可见的部份 |
12 | Expose | 应用或部件从被其他窗口掩盖看不见, 而露出来 |
9 | FocusIn | 部件取得焦聚时 |
10 | FocusOut | 部件失去焦聚时 |
2 | KeyPress | 键盘的按键被按下 |
3 | KeyRelease | 键盘的按键被放开 |
8 | Leave | 鼠标离开部件可见的部份 |
19 | Map | 部件在应用中出现 |
6 | Motion | 鼠标在部件内部移动 |
38 | MouseWheel | 鼠标滚轮上下滚动, 仅适用于 Window/MacOS |
18 | Unmap | 部件永远消失不见 |
15 | Visibility | 在屏幕上, 窗口开始可见 |
事件的修饰器 modifier
修饰器 | 说明 |
---|---|
Alt | ALT 键按下时 |
Any | 通用情况, 比如按键, 鼠标等, 可以不用指定是哪一个键 |
Control | CTRL 键按下时 |
Double | 指短时间内, 连续两次的事件同时发生 |
Lock | caps lock 键按下时 |
Shift | Shift 键按下时 |
Triple | 指短时间内, 连续三次的事件同时发生 |
按键名称
- keysym 代表字符的字符串名称 key symbol
- keycode 按键码, 不受其他辅助键的影响, 如 A 和 a 的 keycode 相同.
- keysym_num 等同 key symbol, 同一按键会有不同的代表码, 比如 A 和 a 的 keysym_num 不同.
- Key 键盘上的文本, 这里以
"Latin-1"
编码集代表通用的 101 键盘.
keysym | keycode | keysym_num | Key |
---|---|---|---|
Alt_L | 64 | 65513 | left alt |
Alt_R | 113 | 65514 | right alt |
BackSpace | 22 | 65288 | backspace |
Cancel | 110 | 65387 | break |
Caps_Lock | 66 | 65549 | CapsLock |
Control_L | 37 | 65507 | left CTRL |
Control_R | 109 | 65508 | right CTRL |
Delete | 107 | 65535 | Delete |
Down | 104 | 65364 | ↓ |
End | 103 | 65367 | end |
Escape | 9 | 65307 | esc |
Execute | 111 | 65378 | SysReq |
F1 | 67 | 65470 | F1 |
F2 | 68 | 65471 | F2 |
Fi | 66+i | 65469+i | Fi |
F12 | 96 | 65481 | F12 |
Home | 97 | 65360 | home |
Insert | 106 | 65379 | insert |
Left | 100 | 65361 | ← |
Linefeed | 54 | 106 | Linefeed (control-J) |
KP_0 | 90 | 65438 | keypad 0 |
KP_1 | 87 | 65436 | keypad 1 |
KP_2 | 88 | 65433 | keypad 2 |
KP_3 | 89 | 65435 | keypad 3 |
KP_4 | 83 | 65430 | keypad 4 |
KP_5 | 84 | 65437 | keypad 5 |
KP_6 | 85 | 65432 | keypad 6 |
KP_7 | 79 | 65429 | keypad 7 |
KP_8 | 80 | 65431 | keypad 8 |
KP_9 | 81 | 65434 | keypad 9 |
KP_Add | 86 | 65451 | keypad + |
KP_Begin | 84 | 65437 | keypad center (5) |
KP_Decimal | 91 | 65439 | keypad . |
KP_Delete | 91 | 65439 | keypad delete |
KP_Divide | 112 | 65455 | keypad / |
KP_Down | 88 | 65433 | keypad ↓ |
KP_End | 87 | 65436 | keypad end |
KP_Enter | 108 | 65421 | keypad enter |
KP_Home | 79 | 65429 | keypad home |
KP_Insert | 90 | 65438 | keypad insert |
KP_Left | 83 | 65430 | keypad ← |
KP_Multiply | 63 | 65450 | keypad × |
KP_Next | 89 | 65435 | keypad PageDown |
KP_Prior | 81 | 65434 | keypad PageUp |
KP_Right | 85 | 65432 | keypad → |
KP_Subtract | 82 | 65453 | keypad - |
KP_Up | 80 | 65431 | keypad ↑ |
Next | 105 | 65366 | PageDown |
Num_Lock | 77 | 65407 | NumLock |
Pause | 110 | 65299 | pause |
111 | 65377 | PrintScrn | |
Prior | 99 | 65365 | PageUp |
Return | 36 | 65293 | enter (control-M) |
Right | 102 | 65363 | → |
Scroll_Lock | 78 | 65300 | ScrollLock |
Shift_L | 50 | 65505 | left shift |
Shift_R | 62 | 65506 | right shift |
Tab | 23 | 65289 | tab |
Up | 98 | 65362 | ↑ |
事件处理函数 handler
- 函数的参数主要是一个事件对象, 用来说明事件发生时的一些情况, 定义的方式如下
def handler_name(event):
""" general function """
...
def handler_name(self, event):
""" general method in a class """
...
- 事件 event 对象的属性如下, 有的会被设置, 有的不会, 视事件的类别而定.
属性 | 说明 |
---|---|
char | KeyPress/KeyRelease 事件中, 代表一般 ASCII 字符串 |
delta | MouseWheel 事件中, 正值代表上卷, 负值代表下卷; 在 Window 下, 通常是 120 的倍数; 在 MacOS 下, 为 1 的倍数 |
height | Configure 事件中, 代表部件的新高度点素 |
keycode | KeyPress/KeyRelease 事件中, 代表 keycode |
keysym | KeyPress/KeyRelease 事件中, 代表 keysym |
keysym_num | KeyPress/KeyRelease 事件中, 代表 keysym_num |
num | 鼠标键相事件中, 代表按键的编号, 在 Linux 下, 按键 4 为向上滚动, 按键 5 为向下滚动 |
serial | 随服务器处理客户端请求事件发生递增的序列号, 可以用来确认事件发生的前后关系 |
state | 事件 modifier 的状态 |
time | 一个时间常数, 每 ms 递增, 主要可以用来确认事件之间的时差 |
type | 事件的类型码 type |
widget | 发生事件的部件 |
width | Configure 事件中, 代表部件的新寛度点素 |
x | 事件发生时, 鼠标所在位置相对于部件左上角的 x 座标 |
y | 事件发生时, 鼠标所在位置相对于部件左上角的 y 座标 |
x_root | 事件发生时, 鼠标所在位置相对于屏幕左上角的 x 座标 |
y_root | 事件发生时, 鼠标所在位置相对于屏幕左上角的 y 座标 |
- 事件对象 event 属性 state, 每一个位元都代表某一个状态.
遮罩 | 对应内容 |
---|---|
0x0001 | Shift |
0x0002 | Caps Lock |
0x0004 | Control |
0x0008 | Left-hand Alt |
0x0010 | Num Lock |
0x0080 | Right-hand Alt |
0x0100 | Mouse button 1 |
0x0200 | Mouse button 2 |
0x0400 | Mouse button 3 |
- 虚拟事件
添加一个名为 virtual 字符串值的虚拟事件,事件命名为 "<<…>>", sequence 中为一串实际的事件, 任何一个实际的事件发生, 都会引发该虚拟事件.
# event_delete(virtual, *sequences)
w.event_add('<<panic>>', '<Button-3>', '<KeyPress-Pause>')
其他请参考
event_delete(virtual, *sequences)
event_delete(virtual, *sequences)
event_generate(sequence, **kw)
event_info(virtual=None)
待续
本作品采用《CC 协议》,转载必须注明作者和本文链接