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 协议》,转载必须注明作者和本文链接
关于 LearnKu