事件处理
文章目录
- 鼠标和键盘事件
- 多种事件绑定方式汇总
- 组件对象的绑定
- 组件类的绑定
一个GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生,并作出相应的处理。
Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑定给各个控件的各种事件。
widget.bind(event, handler)
如果相关事件发生, handler
函数会被触发, 事件对象event
会传递给handler 函数
鼠标和键盘事件
代码 | 说明 |
---|---|
<Button-1><ButtonPress-1><1> | 鼠标左键按下。2 表示右键,3 表示中键; |
<ButtonRelease-1> | 鼠标左键释放 |
<B1-Motion> | 按住鼠标左键移动 |
<Double-Button-1> | 双击左键 |
<Enter> | 鼠标指针进入某一组件区域 |
<Leave> | 鼠标指针离开某一组件区域 |
<MouseWheel> | 滚动滚轮; |
<KeyPress-a> | 按下a 键,a 可用其他键替代 |
<KeyRelease-a> | 释放a 键。 |
<KeyPress-A> | 按下A 键(大写的A) |
<Alt-KeyPress-a> | 同时按下alt 和a;alt 可用ctrl 和shift 替代 |
<Double-KeyPress-a> | 快速按两下a |
<Control-V> | CTRL 和V 键被同时按下,V 可以换成其它键位 |
event 对象常用属性
名称 | 说明 |
---|---|
char | 按键字符,仅对键盘事件有效 |
keycode | 按键编码,仅对键盘事件有效 |
keysym | 按键名称,仅对键盘事件有效。比如按下空格键:键的char : 键的keycode:32 ,键的keysym:space ,比如按下a 键:键的char:a 键的keycode :65 键的keysym:a |
num | 鼠标按键,仅对鼠标事件有效 |
type | 所触发的事件类型 |
widget | 引起事件的组件 |
width,height | 组件改变后的大小,仅Configure 有效 |
x,y | 鼠标当前位置,相对于父容器 |
x_root,y_root | 鼠标当前位置,相对于整个屏幕 |
示例 鼠标事件和键盘事件用法测试
from tkinter import *
root = Tk();root.geometry("530x300")
c1 = Canvas(root,width=200,height=200,bg="green")
c1.pack()
def mouseTest(event):print("鼠标左键单击位置(相对于父容器):{0},{1}".format(event.x,event.y))print("鼠标左键单击位置(相对于屏幕):{0},{1}".format(event.x_root,event.y_root))print("事件绑定的组件:{0}".format(event.widget))
def testDrag(event):c1.create_oval(event.x,event.y,event.x+1,event.y+1)
def keyboardTest(event):print("键的keycode:{0},键的char:{1},键的keysym:{2}".format(event.keycode,event.char,event.keysym))
def press_a_test(event):print("press a")
def release_a_test(event):print("release a")c1.bind("<Button-1>",mouseTest) # 鼠标左键事件,调用mouseTest函数
c1.bind("<B1-Motion>",testDrag) # 按住鼠标左键移动事件,调用testDrag函数
root.bind("<KeyPress>",keyboardTest) # 键盘事件,调用keyboardTest函数
root.bind("<KeyPress-a>",press_a_test)# 按压键盘a事件,调用press_a_test函数
root.bind("<KeyRelease-a>",release_a_test) # 释放a事件,调用release_a_test函数
root.mainloop()
多种事件绑定方式汇总
组件对象的绑定
- 通过command 属性绑定(适合简单不需获取event 对象)
Button(root,text=”登录”,command=login)
- 通过bind()方法绑定(适合需要获取event 对象)
c1 = Canvas()
c1.bind(“<Button-1>”,drawLine)
组件类的绑定
调用对象的bind_class 函数,将该组件类所有的组件绑定事件:
w.bind_class(“Widget”,”event”,eventhanler)
比如:btn01.bind_class(“Button”,”<Button-1>”,func)
示例 多种事件绑定方式总结
# coding=utf-8
# 多种事件绑定方式汇总
from tkinter import *
root = Tk()
root.geometry("270x30")def mouseTest1(event):print("bind()方式绑定,可以获取event 对象")print(event.widget)
def mouseTest2(a, b):print("a={0},b={1}".format(a, b))print("command 方式绑定,不能直接获取event 对象")
def mouseTest3(event):print("右键单击事件,绑定给所有按钮啦!!")print(event.widget)b1 = Button(root, text="测试bind()绑定")
b1.pack(side="left")# bind 方式绑定事件
b1.bind("<Button-1>", mouseTest1)# command 属性直接绑定事件
b2 = Button(root, text="测试command2",
command=lambda: mouseTest2("zzz", "huahua"))
b2.pack(side="left")
b1 = Button(root, text="测试bind()绑定")
b1.pack(side="left")# bind 方式绑定事件
b1.bind("<Button-1>", mouseTest1)
# command 属性直接绑定事件
b2 = Button(root, text="测试command2",
command=lambda: mouseTest2("lala", "dada"))
b2.pack(side="left")
# 给所有Button 按钮都绑定右键单击事件<Button-2>
b1.bind_class("Button", "<Button-2>", mouseTest3)
root.mainloop()