欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-06-21

   ✨✨✨

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

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

目录

 前言

鼠标和键盘事件

event 对象常用属性

测试键盘和鼠标事件 

 lambda 表达式详解

❤️测试lambda用法

多种事件绑定方式汇总

组件对象的绑定

组件类的绑定

 多种事件绑定方式汇总

  往期回顾


  前言

一个 GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生,并作出相应的处理。Tkinter 提供了用以处理相关事件的机制、处理函数可被绑定给各个控件的各种事件。

widget.bind(event, handler)

 如果相关事件发生, handler 函数会被触发,   事件对象event 会传递给 handler 函数.

鼠标和键盘事件

代码

说明

<1>

鼠标左键按下。 2 表示右键,3 表示中键;

鼠标左键释放

按住鼠标左键移动

双击左键

鼠标指针进入某一组件区域

鼠标指针离开某一组件区域

滚动滚轮;

按下 a 键,a 可用其他键替代

释放 a 键。

按下 A 键(大写的 A)

同时按下 alt 和 a;alt 可用 ctrl 和 shift 替代

快速按两下 a

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("",mouseTest)c1.bind("",testDrag)root.bind("",keyboardTest)root.bind("",press_a_test) #只针对小写的a,大写的A不管用root.bind("",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(“”,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("", mouseTest1)# command属性直接绑定事件b2 = Button(root, text="测试command2", command=lambda: mouseTest2("小白", "加油"))b2.pack(side="left")# 给所有Button按钮都绑定右键单击事件b1.bind_class("Button", "", 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博客

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。