Tkinter (44) 事件 Event

在我们的程序发生的一些情況, 我們称之事件, 将该事件及當时相关的参数, 连结到某个函数, 称为绑定, 当事件发生, 就会调用该函数. 事件有关的内容分为三大部份, 事件 event, 回调函数 callback 以及绑定 binding.

绑定的层级

  1. 绑定部件, 使用 bind() 方法
  2. 绑定部件类别, 使用 bind_class() 方法
  3. 绑定应用, 使用 bind_all() 方法

事件的序列 sequence

  1. 事件的序列以字符串表示, 内含单一或多个事件模式 pattern. 符合要求的事件, 必须所有的事件模式按照顺序都发生. 事件通常是标准的输入设备, 像键盘, 鼠标等.
  • modifier 诸如组合按键, 例如 SHIFT, CTRL, ALT;
  • type 可以是单一的事件, 如字母或按键名
  • detail 说明细节, 比如鼠标的第 3 个按键
  1. 标准的事件序列格式, 说明如后.

<[modifier-]…type[-detail]>

  1. 例子
<Button-1> type:鼠标, detail:第一个按钮
<KeyPress-H> type:按键按下, detail:H 键
<Control-Shift-KeyPress-H> modifier:Control/Shift, type:按键按下, detail:H 键
  1. 简易表达方式
  • '<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
Print 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

  1. 函数的参数主要是一个事件对象, 用来说明事件发生时的一些情况, 定义的方式如下
def handler_name(event):
    """ general function """
    ...

def handler_name(self, event):
    """ general method in a class """
    ...
  1. 事件 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 座标
  1. 事件对象 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
  1. 虚拟事件

添加一个名为 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 协议》,转载必须注明作者和本文链接
Jason Yang
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!