找回密码
 会员注册
查看: 37|回复: 0

pythonGUI开发tkinter事件处理的几种方式详解与应用实战

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-4 21:07:51 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:python图形化GUI编程tkinter精讲景天的主页:景天科技苑文章目录tkinter事件处理Tkinter如何指定事件处理程序实例绑定(Instancebind):可以将事件绑定到一个特定的控件。tkinter常见事件表示汇总常见的鼠标事件类型汇总常见的键盘事件类型汇总窗口和控件相关事件类型汇总鼠标事件和键盘事件用法测试类绑定(bind_class):可以将事件绑定到类的所有小部件多种事件绑定方式总结tkinter事件处理事件处理(EventHandling),是GUI程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件,而事件处理则是驱动这台机器“正常”运转的关键所在,是实现人机交互的关键。在一款GUI程序中,我们将用户对软件的操作统称为“事件”,比如鼠标点击按钮、键盘输入文本以及窗口管理器触发的重绘等,这些事件有一个共同的特点,即都是由用户自身直接或者间接触发的。一个GUI应用整个生命周期都处在一个消息循环(eventloop)中,它等待事件的发生,并作出相应的处理。Tkinter提供了用以处理相关事件的机制处理函数可被绑定给各个控件的各种事件。事件(event)是应用程序需要知道识别的一些事情。或者说,事件(event)表示程序某件事发生的信号,可以用来触发一段特定的代码——事件处理程序。事件处理程序(eventhandler)是应用程序中的一个函数,当事件发生时调用它。当事件发生在控件(widget:组件、小部件、控件)上,调用事件处理程序时,我们称之为绑定(binding)。绑定就是将事件和事件处理程序建立联系。Tkinter如何指定事件处理程序一、在创建控件对象时,可以使用控件中的command参数指定事件处理程序:command=函数,那么点击控件的时候将会触发函数,适合简单不需获取event对象。二、还可以使用绑定(bind)方法指定事件处理程序,Tkinter可以在以下两个级别将事件处理程序绑定(bind)到事件:实例绑定(Instancebind):可以将事件绑定到一个特定的控件。其语法格式如下:widget.bind(sequence,func,add='')1其中,widget代表控件的控件对象,之后,采用bind()方法进行事件绑定,该函数的参数:sequence:表示事件的类型,也称事件码,是Tkinter模块规定好的,并使用“尖括号”的形式进行包裹;Tkinter中经常使用的事件类型,描述格式为:,其中:modifier:事件修饰符。如:Alt、Shit组合键和Double事件。type:事件类型。如:按键(Key)、鼠标(Button/Motion/Enter/Leave/Relase)、Configure等。detail:事件细节。如:鼠标左键(1)、鼠标中键(2)、鼠标右键(3)。tkinter常见事件表示汇总常见的鼠标事件类型汇总常见的键盘事件类型汇总窗口和控件相关事件类型汇总func:表示事件的处理函数,当触发事件时执行。事件处理函数或为普通的函数,或为类中定义的函数(也叫方法)。函数def事件处理函数名称(event):函数体类的一个方法def事件处理函数名称(self,event):函数体其中,self代表实例本身使用绑定(bind)方法指定事件处理程序函数,和前介绍的面通过command参数指定事件处理函数不同之处是有一个参数,一般写为event,也可以用其它自定义名称(因损害易读性不建议),通过这个参数能够获取到Event对象的属性(attributes)。传递给处理程序的Event对象的常用属性如下:num:1/2/3中的一个,表示点击了鼠标的哪个按键,按键分为左、中、右鼠标事件和键盘事件用法测试#测试键盘和鼠标事件fromtkinterimport*root=Tk();root.geometry("530x300")c1=Canvas(root,width=200,height=200,bg="green")c1.pack()defmouseTest(event):print("鼠标左键单击位置(相对于父容器):{0},{1}".format(event.x,event.y))print("鼠标左键单击位置(相对于屏幕):{0},{1}".format(event.x_root,event.y_root))print("事件绑定的组件:{0}".format(event.widget))deftestDrag(event):#画椭圆c1.create_oval(event.x,event.y,event.x+1,event.y+1)defkeyboardTest(event):print("键的keycode:{0},键的char:{1},键的keysym:{2}".format(event.keycode,event.char,event.keysym))defpress_a_test(event):print("pressa")defrelease_a_test(event):print("releasea")defpress_A_test(event):print("pressA")defrelease_A_test(event):print("releaseA")#按下鼠标左键触发c1.bind("",mouseTest)#按下鼠标左键移动鼠标触发c1.bind("",testDrag)#按下任意按键触发root.bind("",keyboardTest)#按下小写a时触发root.bind("",press_a_test)#按下大写A时触发root.bind("",press_A_test)#松开小写a时触发root.bind("",release_a_test)#松开大写a时触发root.bind("",release_A_test)root.mainloop()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354按下a键,并松下按下A键,并松下在画布上,按住左键不放,移动类绑定(bind_class):可以将事件绑定到类的所有小部件其语法格式如下:widget.bind_class(className,sequence,func,add='')1其中,className代表一类控件的字符串;widget代表控件对象,随便找个控件对象即可,sequence、func、add见前面说明。.bind_class类似于.bind(),但适用于所有名为className的控件(例如,“Button”)。比如:btn01.bind_class(“Button”,””,func)多种事件绑定方式总结#多种事件绑定方式汇总fromtkinterimport*root=Tk();root.geometry("270x130")root.title("测试绑定类")defmouseTest1(event):print("bind()方式绑定,可以获取event对象")print(event.widget)defmouseTest2(a,b):print("a={0},b={1}".format(a,b))print("command方式绑定,不能直接获取event对象")defmouseTest3(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("jingtian","lingge"))b2.pack(side="left")#给所有Button按钮都绑定中键单击事件b1.bind_class("Button","",mouseTest3)root.mainloop()123456789101112131415161718192021222324252627282930313233343536运行分别单击鼠标左键两个按钮第一个是bing绑定对象方法,第二个是command触发的鼠标中建单击两个按钮
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-3 01:11 , Processed in 0.466223 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表