事件处理
一个 GUI 应用整个生命周期都处在一个消息循环 (event loop) 中。它等待事件的发生,并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制处理函数可被绑定给各个控件的各种事件。
widget.bind(event, handler)
如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数
1. 鼠标和键盘事件
事件 | 说明 |
---|---|
< Enter > | 鼠标光标进入控件时触发 |
< Leave > | 鼠标光标离开控件时触发 |
< Key > | 响应所有的按键(按下) |
< KeyRelease > | 响应所有的按键(松开) |
< FocusIn > | 控件或控件的子控件获得键盘焦点(设置焦点 label.focus_set()) |
< FocusOut > | 控件丢失键盘焦点 (焦点移动到另一个控件) |
< Return > | 只有回车键响应 |
< Escape > | esc键 |
< space > | 空格键 |
< Tap > | Tap键 |
< Up >/< Down >/< Left >/< Right > | 上下左右键 |
< Shitf_L >/< Shift_R > | 左右Shift键(类似有左右两个键的, 添加_L/_R区分) |
< Control-Alt-a > | 组合键(可识别任意组合键) |
需要注意的是: 识别组合键时, 一般是按下组合键的最后一个键才会触发操作
2. event 对象常用属性
3. lambda 表达式详解
lambda 表达式定义的是一个匿名函数,只适合简单输入参数,简单计算返回结果,不适合功能复杂情况。 lambda 定义的匿名函数也有输入、也有输出,只是没有名字。
语法格式如下:
lambda 参数值列表:表达式
参数值列表即为输入,表达式计算的结构即为输出
我们写一个最简单的案例:
add3args = lambda x,y,z:x+y+z
print(add3args(10,20,30))
上面的 lambda 表达式相当于如下函数定义:
def add3args(x,y,z):
return x+y+z
lambda 表达式的参数值列表可以为如下内容:
我们在平时使用时,注意 lambda 只是一个匿名函数(没有名字的函数),功能不强,不要过度使用;
4. 使用 lambda 表达式实现传参
【示例】使用 lambda 帮助 command 属性绑定时传参
# coding=utf-8
# 测试 command 属性绑定事件,测试 lambda 表达式帮助传参
from tkinter import *
root = Tk();root.geometry("270x50")
def mouseTest1():
print("command 方式,简单情况:不涉及获取 event 对象,可以使用")
def mouseTest2(a,b):
print("a={0},b={1}".format(a,b))
Button(root, text="测试 command1",command=mouseTest1).pack(side="left")
Button(root, text="测试 command2",command=lambda: mouseTest2("cheney","good man")).pack(side="left")
root.mainloop()
5. 多种事件绑定方式汇总
• 组件对象的绑定
• 通过 command 属性绑定(适合简单不需获取 event 对象)
Button(root,text="登录",command=login)
• 通过 bind()方法绑定(适合需要获取 event 对象)
c1 = Canvas()
c1.bind("",drawLine)
• 组件类的绑定
调用对象的 bind_class 函数,将该组件类所有的组件绑定事件:
w.bind_class("Widget","event",eventhanler)
比如:btn01.bind_class("Button","",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("cheney", "good man"))
b2.pack(side="left")
# 给所有 Button 按钮都绑定右键单击事件<Button-3>
b1.bind_class("Button", "<Button-3>", mouseTest3)
root.mainloop()
6. 其他组件
我们在前面介绍了最常用的几个组件,接下来我们介绍其他 一些组件。
Scale 移动滑块
• Scale(移动滑块)用于在指定的数值区间,通过滑块的移动来选择值。
【示例】使用 Scale(移动滑块)控制字体大小变化
#coding=utf-8
#optionmenu 的使用测试
from tkinter import *
root = Tk();root.geometry("400x150")
def test1(value):
newFont = ("宋体",value)
a.config(font=newFont)
s1=Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL,command=test1)
s1.pack()
a = Label(root,text="tkinter",width=10,height=1,bg="black",fg="white")
a.pack()
root.mainloop()
颜色选择框
颜色选择框可以帮助我们设置背景色、前景色、画笔颜色、 字体颜色等等。
【示例】颜色选择框基本用法
#coding=utf-8
#askcolor 颜色选择框的测试,改变背景色
from tkinter import *
from tkinter.colorchooser import *
root = Tk();root.geometry("400x150")
def test1():
s1 = askcolor(color="red", title="选择背景色")
#((0.0, 0.0, 255.99609375), '#0000ff')
root.config(bg=s1[1])
Button(root,text="选择背景色",command=test1).pack()
root.mainloop()
文件对话框
文件对话框帮助我们实现可视化的操作目录、操作文件。最后,将文件、目录的信息传入到程序中。文件对话框包含如下一些常用函数:
命名参数 options 的常见值如下:
【示例】文件对话框基本用法
#coding=utf-8
#askcolor 颜色选择框的测试,改变背景色
from tkinter import *
from tkinter.filedialog import *
root = Tk();root.geometry("400x100")
def test1():
f = askopenfilename(title="上传文件", initialdir="e:\视频",filetypes=[("视频文件",".wmv")])
show["text"]=f
Button(root,text="选择编辑的视频文件",command=test1).pack()
show = Label(root,width=40,height=3,bg="green")
show.pack()
root.mainloop()
通用消息框
messagebox(通用消息框)用于和用户简单的交互,用户点击确定、取消。如下列出了 messagebox 的常见函数:
【示例】通用消息框的基本用法
#coding=utf-8
#简单对话框
from tkinter import *
from tkinter.messagebox import *
root = Tk()
root.geometry("400x100")
while True:
a1 = showinfo(title="循环",message="无限循环")
print(a1)
root.mainloop()
简单输入对话框
simpledialog(简单对话框)包含如下常用函数:
参数中,title 表示窗口标题;prompt 是提示信息;命名参数 kw 为各种选项:initialvalue(初始值)、minvalue(最小值)、 maxvalue(最大值)
【示例】简单对话框基本用法
from tkinter import *
from tkinter.simpledialog import *
root = Tk()
root.geometry("400x100")
def test1():
a = askinteger(title="输入年龄", prompt="请输入年龄", initialvalue=18, minvalue=1, maxvalue=100)
show["text"] = "年龄:"+str(a)
Button(root, text='你多大了?请输入:', command=test1).pack()
show = Label(root, width=40, height=3, bg="green")
show.pack()
root.mainloop()