GUI 图形用户界面编程(十三)-事件处理

   ✨✨✨

感谢优秀的你打开了小白的文章 

希望在看文章的你今天又进步了一点点,离美好生活更近一步!🌈

目录

🌻 前言

🍋鼠标和键盘事件

🌟event 对象常用属性

🍺测试键盘和鼠标事件 

🌲 lambda 表达式详解

❤️测试lambda用法

🏆多种事件绑定方式汇总

组件对象的绑定

组件类的绑定

🍉 多种事件绑定方式汇总

  🚀往期回顾


 🌻 前言

个 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 图形用户界面编程(五):

(357条消息) GUI 图形用户界面编程(五)-登录页面_am_student的博客-CSDN博客

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值