✨✨✨
感谢优秀的你打开了小白的文章
“希望在看文章的你今天又进步了一点点,离美好生活更近一步!”🌈
目录
🌻 前言
一个 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 | 鼠标当前位置,相对于整个屏幕 |
🍺测试键盘和鼠标事件
# coding=utf-8
# 测试键盘和鼠标事件
from tkinter import *
root = Tk();root.geometry("530x300")
c1 = Canvas(root,width=300,height=300,bg="pink")
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)
c1.bind("<B1-Motion>",testDrag)
root.bind("<KeyPress>",keyboardTest)
root.bind("<KeyPress-a>",press_a_test) #只针对小写的a,大写的A不管用
root.bind("<KeyRelease-a>",release_a_test)
root.mainloop()
结果如下:
随便写了数字,事件发生,鼠标事件与键盘事件。
🌲 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 格式 | 说明 |
lambda x, y: x*y | 函数输入是 x 和 y,输出是它们的积 x*y |
lambda:None | 函数没有输入参数,输出是 None |
lambda:aaa(3,4) | 函数没有输入参数,输出是 aaa(3,4)的结 果 |
lambda *args: sum(args) | 输入是任意个数的参数,输出是它们的和 |
lambda **kwargs: 1 | 输入是任意键值对参数,输出是 |
❤️测试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("小", "白")).pack(side="left")
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)
🍉 多种事件绑定方式汇总
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("小白", "加油"))
b2.pack(side="left")
# 给所有Button按钮都绑定右键单击事件<Button-2>
b1.bind_class("Button", "<Button-2>", mouseTest3)
root.mainloop()
🚀往期回顾
📣GUI 图形用户界面编程(一): (278条消息) GUI 图形用户界面编程(一)_am_student的博客-CSDN博客
📣GUI 图形用户界面编程(二):
(278条消息) GUI 图形用户界面编程(二)经典案例_am_student的博客-CSDN博客
📣GUI 图形用户界面编程(三):
(278条消息) GUI 图形用户界面编程(三)基本框架与Label的使用_am_student的博客-CSDN博客
📣GUI 图形用户界面编程(四):
(278条消息) GUI 图形用户界面编程(四)-Button组件_am_student的博客-CSDN博客
📣GUI 图形用户界面编程(五):