python GUI编程之Tkinter详细讲解三
内容回顾:
内容回顾:
文章目录:
5. 事件响应
5.1 事件绑定和触发
5.2 lambda表达式实现传参
5. 事件响应
5.1 事件绑定和触发
Tkinter
提供一个强大的机制可以让你自由地处理事件,对于每个组件来说,通过bind()
方法将函数或方法绑定到具体的事件触发上- 绑定语法:
组件名.bind(event, handler)
- 当被触发的事件满足该组件绑定的事件时,Tkinter 就会带着
事件对象(Event)
(事件自动传入给方法函数的参数)去调用handler()
方法
事件序列
- Tkinter 使用一种称为
事件序列
的机制来允许用户定义事件,事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件
(如果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用) - 事件序列使用语法描述:
<modifier-type-detail>
- 事件序列是包含在尖括号
< >
中 type
部分的内容是最重要的,常用于描述普通的事件类型modifier
部分的内容是可选的,它通常用于描述组合键detail
部分的内容是可选的,它通常用于描述具体的按键
<Button-1>
用户点击鼠标左键<KeyPress-H>
用户点击 H 按键<Control-Shift-KeyPress-H>
用户同时点击 Ctrl + Shift + H
type汇总说明表
type | 含义 |
---|---|
Activate | 当组件的状态从“未激活”变为“激活”的时候触发该事件 |
Button | 1. 当用户点击鼠标按键的时候触发该事件 2. detail 部分指定具体哪个按键: <Button-1>鼠标左键 ,<Button-2> 鼠标中键,<Button-3> 鼠标右键 |
ButtonRelease | 1. 当用户释放鼠标按键的时候触发该事 2. 在大多数情况下,比 Button 要更好用,因为如果当用户不小心按下鼠标,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件 |
Configure | 当组件的尺寸发生改变的时候触发该事件 |
Deactivate | 当组件的状态从“激活”变为“未激活”的时候触发该事件 |
Destroy | 当组件被销毁的时候触发该事件 |
Enter | 1. 当鼠标指针进入组件的时候触发该事件 2. 注意:不是指用户按下回车键 |
Expose | 当窗口或组件的某部分不再被覆盖的时候触发该事件 |
FocusIn | 1. 当组件获得焦点的时候触发该事件 2. 用户可以用 Tab 键将焦点转移到该组件上(需要该组件的 takefocus 选项为 True) 3. 你也可以调用 focus_set() 方法使该组件获得焦点 |
FocusOut | 当组件失去焦点的时候触发该事件 |
KeyPress | 1. 当用户按下键盘按键的时候触发该事件 2. detail 可以指定具体的按键: <KeyPress-键位> 3. KeyPress 可以简写为 Key |
KeyRelease | 当用户释放键盘按键的时候触发该事件 |
Leave | 当鼠标指针离开组件的时候触发该事件 |
Map | 1. 当组件被映射的时候触发该事件 2. 意思是在应用程序中显示该组件的时候,例如调用 grid() 方法 |
Motion | 当鼠标在组件内移动的整个过程均触发该事件 |
MouseWheel | 1. 当鼠标滚轮滚动的时候触发该事件 |
Unmap | 1. 当组件被取消映射的时候触发该事件 2. 意思是在应用程序中不再显示该组件的时候,例如调用 grid_remove() 方法 |
Visibility | 当应用程序至少有一部分在屏幕中是可见的时候触发该事件 |
modifier内容汇总
modifier | 含义 |
---|---|
Alt | 当按下 Alt 按键的时候 |
Any | 任何类型的按键被按下的时候,如 <Any-KeyPress> 表示当用户按下任何按键时触发事件 |
Control | 当按下 Ctrl 按键的时候 |
Double | 后续两个事件被连续触发的时候,如 <Double-Button-1> 表示当用户双击鼠标左键时触发事件 |
Lock | 当打开大写字母锁定键(CapsLock)的时候 |
Shift | 当按下 Shift 按键的时候 |
Triple | 跟 Double 类似,当后续三个事件被连续触发的时候 |
Event 对象
属性 | 含义 |
---|---|
widget | 产生该事件的组件 |
x, y | 当前的鼠标位置坐标(相对于窗口左上角,像素为单位) |
x_root, y_root | 当前的鼠标位置坐标(相对于屏幕左上角,像素为单位) |
char | 按键对应的字符(键盘事件专属) |
keysym | 按键名,键盘事件专属 |
keycode | 按键码,键盘事件专属 |
num | 按钮数字(鼠标事件专属) |
width, height | 组件的新尺寸(Configure 事件专属) |
type | 该事件类型 |
from tkinter import *
def show(event):
s = event.keysym
lb.config(text=s)
root = Tk()
root.title('按键实验')
root.geometry('320x240')
lb = Label(root,text='请按键',font=('黑体',48))
lb.bind('<Key>',show)
lb.focus_set()
lb.pack()
root.mainloop()

5.2 lambda表达式实现传参
- 组件绑定一个执行函数通过属性
command = 函数名
来实现,但是此方法不能够给函数传递参数 - 用lambda表达式来实现参数的传递 :
command = lambda 参数值列表:表达式
感谢阅读 若有错误 欢迎指正 !!!