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

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python图形化GUI编程tkinter精讲
景天的主页:景天科技苑

文章目录

  • tkinter事件处理
    • Tkinter如何指定事件处理程序
    • 实例绑定(Instance bind):可以将事件绑定到一个特定的控件。
    • tkinter常见事件表示汇总
      • 常见的鼠标事件类型汇总
      • 常见的键盘事件类型汇总
      • 窗口和控件相关事件类型汇总
    • 鼠标事件和键盘事件用法测试
    • 类绑定(bind_class):可以将事件绑定到类的所有小部件
      • 多种事件绑定方式总结

tkinter事件处理

事件处理(Event Handling),是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件, 而事件处理则是驱动这台机器“正常”运转的关键所在,是实现人机交互的关键。
在一款 GUI 程序中,我们将用户对软件的操作统称为“事件”,比如鼠标点击按钮、键盘输入文本以及窗口管理器触发的重绘等,这些事件有一个共同的特点,即都是由用户自身直接或者间接触发的。
一个 GUI 应用整个生命周期都处在一个消息循环 (event loop) 中,它等待事件的发生,并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制处理函数可被绑定给各个控件的各种事件。
事件(event)是应用程序需要知道识别的一些事情。或者说,事件(event)表示程序某件事发生的信号,可以用来触发一段特定的代码——事件处理程序。
事件处理程序(event handler)是应用程序中的一个函数,当事件发生时调用它。
当事件发生在控件(widget:组件、小部件、控件)上,调用事件处理程序时,我们称之为绑定( binding)。绑定就是将事件和事件处理程序建立联系。

Tkinter如何指定事件处理程序

一、在创建控件对象时,可以使用控件中的command参数指定事件处理程序:command=函数,那么点击控件的时候将会触发函数,适合简单不需获取 event 对象。
二、还可以使用绑定(bind)方法指定事件处理程序,Tkinter可以在以下两个级别将事件处理程序绑定(bind)到事件:

实例绑定(Instance bind):可以将事件绑定到一个特定的控件。

其语法格式如下:

widget.bind(sequence,func,add='')

其中,widget 代表控件的控件对象,之后,采用 bind() 方法进行事件绑定,
该函数的参数:
sequence:表示事件的类型,也称事件码,是 Tkinter 模块规定好的,并使用“尖括号”的形式进行包裹;
Tkinter 中经常使用的事件类型,描述格式为:<[modifier-]-type[-detail]>,其中:
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中的一个,表示点击了鼠标的哪个按键,按键分为左、中、右
在这里插入图片描述在这里插入图片描述

鼠标事件和键盘事件用法测试

# 测试键盘和鼠标事件from tkinter import *root = Tk();root.geometry("530x300")c1 = Canvas(root,width=200,height=200,bg="green")
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")def press_A_test(event):print("press A")def release_A_test(event):print("release A")#按下鼠标左键触发
c1.bind("<ButtonPress-1>",mouseTest)
#按下鼠标左键移动鼠标触发
c1.bind("<B1-Motion>",testDrag)#按下任意按键触发
root.bind("<KeyPress>",keyboardTest)
#按下小写a时触发
root.bind("<KeyPress-a>",press_a_test)
#按下大写A时触发
root.bind("<KeyPress-A>",press_A_test)
#松开小写a时触发
root.bind("<KeyRelease-a>",release_a_test)
#松开大写a时触发
root.bind("<KeyRelease-A>",release_A_test)root.mainloop()

按下a键,并松下
在这里插入图片描述

按下A键,并松下
在这里插入图片描述

在画布上,按住左键不放,移动
在这里插入图片描述

类绑定(bind_class):可以将事件绑定到类的所有小部件

其语法格式如下:

widget.bind_class(className, sequence,func,add='')

其中,className 代表一类控件的字符串;widget 代表控件对象,随便找个控件对象即可,sequence、func、add见前面说明。
.bind_class类似于.bind(),但适用于所有名为className的控件(例如,“Button”)。

比如:btn01.bind_class(“Button”,”<Button-1>”,func)

多种事件绑定方式总结

# 多种事件绑定方式汇总
from tkinter import *root = Tk();root.geometry("270x130")
root.title("测试绑定类")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("jingtian", "lingge"))
b2.pack(side="left")# 给所有Button按钮都绑定中键单击事件<Button-2>
b1.bind_class("Button", "<Button-2>", mouseTest3)root.mainloop()

运行
在这里插入图片描述

分别单击鼠标左键两个按钮
第一个是bing绑定对象方法,第二个是command触发的
在这里插入图片描述

鼠标中建单击两个按钮
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEM5 Garnet +DSENT: NoC power model 功耗模型

0. 简介 现在&#xff08;2024&#xff09;集成的是dsent。 Garnet作者&#xff0c;Turshar在2018年说Orion已经过时不在集成DSENT&#xff0c;但是集成DSENT的代码随着gem5更新也过时了&#xff0c;而他短期内没有更新的计划&#xff08;2018年说的&#xff09;。2023年还有一…

SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案

JetCache 是一个基于 Java 的分布式缓存解决方案&#xff0c;旨在提供高性能和可扩展性。它支持多种后端存储&#xff0c;如 Redis、Hazelcast、Tair 等&#xff0c;可以作为应用程序的缓存层&#xff0c;有效地提升数据访问性能和响应速度。 JetCache 的主要特点包括&#x…

springboot应用启动太慢排查 半天才打印日志

springboot应用启动太慢排查 半天才打印日志 解决办法 hostnamectl 命令查看主机名 vim /etc/hosts 加上主机名配置 127.0.0.1 hostname

Java_JDK下载与环境变量配置

目录 一、JDK下载安装 二、安装后配置环境变量 三、在编辑器里使用JDK 一、JDK下载安装 JDK 是Java开发工具包&#xff0c;它提供了用于开发和运行Java程序所需的工具和库。JDK包括Java编译器、Java虚拟机、Java标准库等。在IDEA中使用Java语言编写代码时&#xff0c;需要安…

为什么 Kubernetes 调试如此成问题?

在 Kubernetes 集群中调试应用程序问题通常感觉就像在迷宫中穿行。容器在设计上是短暂的&#xff0c;一旦部署就不可改变。当出现问题并且我们需要深入研究问题时&#xff0c;这会带来独特的挑战。在深入研究调试工具和技术之前&#xff0c;必须掌握核心问题&#xff1a;为什么…

openlayers 使用WMTS和XYZ加载天地图切片服务

openlayers 使用WMTS和XYZ加载天地图切片服务 本篇介绍一下使用openlayers加载天地图切片&#xff0c;两种方法&#xff1a; 使用WMTS使用XYZ 1 需求 openlayers加载天地图 2 分析 主要是不同类型source的使用 WMTS&#xff08;Web Map Tile Service&#xff09; 是 OGC…

一道全等三角形证明题

接着上次那道题 一道初中一年级几何题解析&#xff0c;再来做一道初中一年级下半学期几何题目&#xff1a; 傍晚丢垃圾散步时看到小小的学生学习群里丢了这个题目&#xff0c;想到一个解法。实在构造不出契合题干阅读材料结论的三角形&#xff0c;索性先根据这结论做一个推论…

ByteTrack

1. 论文中伪代码表示的流程图 2. 简要版 此图源自&#xff1a; ByteTrack多目标跟踪原理&#xff0c;白老师人工智能学堂 3. 详细版 根据ByteTrack-CPP-ncnn代码的数据流画的较为详细的流程图&#xff1a; 4. ByteTrack-CPP-ncnn的UML类图 Reference ByteTrack多目标跟踪原…

Excel小技巧| 批量多列多行转为一列

前期刘小生Star分享了Excel批量一列转多列多行&#xff0c;你学会了嘛&#xff01; 前期刘小生遇到需“对多列对行数据合并并找到唯一不重复的信息”&#xff0c;今天举一反三&#xff0c;继续沿用“替换等号”方法&#xff0c;将多列多行转为一列&#xff01; 下面一个模拟案…

xml与动态SQL

XML映射文件 规范 XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。 ● XML映射文件的namespace属性为Mapper接口全限定名一致。 ● XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。 动态SQL &…

Excel批量一列转多列多行

你在公司或学校是否遇到过对人员进行分组&#xff0c;你是否曾一个一个复制粘贴&#xff0c;如只有100人&#xff0c;尚有时间一一分组&#xff0c;如1000人&#xff0c;甚至更多&#xff0c;不知分到“地老天荒”是否可以完成&#xff01; 今天刘小生分享一个方法“用替换等号…

环信beta版鸿蒙IM SDK发布!深度适配HarmonyOS NEXT系统

环信beta版鸿蒙IM SDK已正式发布&#xff01;欢迎有需求开发者体验集成&#xff01; 版本亮点 提供原生鸿蒙 SDK&#xff0c;支持原生 ArkTS 语言&#xff0c;全面拥抱鸿蒙生态提供鸿蒙系统上单聊、群聊、会话等能力和服务覆盖消息管理、用户属性、群租管理、离线推送.多设备…

【Echarts系列】平滑折线面积图

【Echarts系列】平滑折线面积图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 平滑折线面积图如图所示&#xff1a; 数据格式 data [{name: 2020年,value: 150},{name: 2021年,value: 168},{name: 2…

tmux 移植到ARM板端运行环境搭建

tmux源码下载&#xff1a; Home tmux/tmux Wiki GitHub 依赖的库代码下载&#xff1a; libevent&#xff1a; ncurses: 第一步&#xff1a;将以上三个代码解压放在同一个目录下&#xff0c;逐个编译 1. cd ./libevent-2.1.12-stable ./configure --host"arm-nextvp…

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以在点击绿旗后让小猫说”你好!"一共10秒? A. B. C. D. 第 2 题 单选题 …

50etf期权交易规则杠杆怎么计算?

今天带你了解50etf期权交易规则杠杆怎么计算&#xff1f;近年来&#xff0c;期权交易在股票市场中变得愈发流行&#xff0c;其中50ETF期权备受关注。作为一种金融衍生品&#xff0c;50ETF期权为投资者提供了更灵活的投资方式和更多的策略选择。 50etf期权交易规则杠杆怎么计算&…

CCF 矩阵重塑

第一题&#xff1a;矩阵重塑&#xff08;一&#xff09; 本题有两种思路 第一种 &#xff08;不确定是否正确 但是100分&#xff09; #include<iostream> using namespace std; int main(){int n,m,p,q,i,j;cin>>n>>m>>p>>q;int a[n][m];for(i…

现代易货:创新交易模式引领物品交换新潮流

在繁华的现代经济浪潮中&#xff0c;物品交换的文化逐渐崭露头角&#xff0c;引领了一种新颖的交易潮流——现代易货交易模式。这种模式不仅是对古老“以物易物”交易的现代化诠释&#xff0c;更是对物品价值多元化和交换方式创新的深入探索。那么&#xff0c;现代易货交易究竟…

员工入职平台ChiefOnboarding

什么是 ChiefOnboarding &#xff1f; ChiefOnboarding 是一个免费开源的员工入职平台。您可以通过 Slack 或门户网站让新员工入职。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 chiefonboarding &#xff0c;选择第一个 chiefonboarding/chiefonboarding&#xff0c…

R语言dplyr统计指定列里面种类个数和比例

输入数据框&#xff1a;dfuorf&#xff0c;Type列有uORF和overlpaORF两种类型 dfuorf1 <- dfuorf %>%group_by(Type) %>% summarise(Countn()) %>% mutate(percentCount/sum(Count)) %>% mutate(percent1 (paste0(round((Count/sum(Count)), 2)*100,"%&…