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