事件机制和消息循环处理
事件处理
一个GUI应用整个生命周期都处在一个消息循环中, 它等待事件的发生, 并作出相应的处理.
Tkinter提供了用于处理相关事件的机制, 处理函数可被绑定给各个控件的各种事件.
widget.bind(event, handler)
如果相关事件发生, handler事件就会被触发, 事件对象event会传递给handler函数
鼠标和键盘事件
代码 | 说明 |
<Button-1><ButtonPress-1><1> | 1-鼠标左键按下, 2-鼠标中键, 3-鼠标右键 |
<ButtonRelease-1> | 鼠标左键释放 |
<B1-Montion> | 按住鼠标左键移动 |
<Double-Button-1> | 双击鼠标左键 |
<Enter> | 鼠标指针进入某一区域 |
<Leave> | 鼠标指针离开某一区域 |
<MouseWheel> | 滚动滚轮 |
<KeyPress-a> | 按下a键(a可用其他代替) |
<KeyRelease-a> | 释放a键 |
<KeyPress-A> | 按下A键(A大写) |
<Alt-KeyPress-a> | 同时按下Alt和a键(Alt可用shift和ctrl键替换) |
<Double-KeyPress-a> | 双击a键 |
<Control-a> | Ctrl和a键同时按下(a可用其他替换) |
event对象常用属性
名称 | 说明 |
char | 按键字符, 只对键盘事件有效 |
keycode | 按键编码, 只对键盘事件有效 |
keysym | 按键名称, 只对键盘字符有效 |
num | 鼠标按键, 仅对鼠标事件有效 |
type | 所触发的事件类型 |
widget | 引起事件的组件 |
width, height | 组件改变后的大小, 仅Configure有效 |
x, y | 鼠标当前位置, 相对于父容器 |
x_root, y_root | 鼠标当前的位置, 相对于整个屏幕 |
1 # coding:utf-8 2 from tkinter import * 3 root = Tk() 4 root.geometry('530x300') 5 6 c1 = Canvas(width=200, height=200, bg='green') 7 c1.pack() 8 9 10 def mouseTest(event): 11 print('鼠标左键单击位置(相对于父容器):{0},{1}'.format(event.x, event.y)) 12 print('鼠标左键单击位置(相对于屏幕):{0},{1}'.format(event.x_root, event.y_root)) 13 print('事件绑定的组件:{0}'.format(event.widget)) 14 15 16 def TestDrag(event): 17 c1.create_oval(event.x, event.y, event.x+1, event.y+1) 18 19 20 def keyboardTest(event): 21 print('键的keycode:{0}, 键的char:{1}, 键的keysym:{2}'.format(event.keycode, event.char, event.keysym)) 22 23 24 def press_a_Test(event): 25 print('press a') 26 27 28 def release_a_Test(event): 29 print('release a') 30 31 32 c1.bind('<Button-1>', mouseTest) 33 c1.bind('<B1-Motion>', TestDrag) 34 root.bind('<KeyPress>', keyboardTest) 35 root.bind('<KeyPress-a>', press_a_Test) 36 root.bind('KeyRelease-a', release_a_Test) 37 38 root.mainloop()