事件机制和消息循环处理

事件处理

    一个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()