当前位置: 首页 > news >正文

tkinter-event事件

欢迎大家来博主的小站传送门

原文出自于这里

Tkinter Event事件处理

事件处理,是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件, 而事件处理则是驱动这台机器“正常”运转的关键所在,它能够将零部件之间“优雅”的贯穿起来,因此“事件处理”可谓是 GUI 程序的“灵魂”,同时它也是实现人机交互的关键。

在一款 GUI 程序中,我们将用户对软件的操作统称为“事件”,比如鼠标点击按钮、键盘输入文本以及窗口管理器触发的重绘事件等,这些事件有一个共同的特点,即都是由用户直接或者间接触发的。

事件绑定方法

Tkinter 提供的事件处理机制允许我们为“控件”绑定相应的事件和事件处理函数(即 callback函数),从而实现控件与用户的交互 语法格式:widget.bind(“”,func)

widget 代表控件的实例对象,之后,采用 bind() 方法进行事件绑定 该函数有两个参数: :一个字符串参数,表示事件的类型,并使用“尖括号”的形式进行包裹; func:表示事件的处理函数(callback,即回调函数),当触发事件时,Tk 会携带事件对象(Event)去调用 func 方法。

注意:bind() 方法可以完成事件与处理函数绑定,而使用 unbind() 方法可以将事件与处理函数解绑。

常用事件类型

事件类型(也称事件码)是 Tkinter 模块规定的,主要包括鼠标、键盘、光标等相关事件

Tkinter 为其规定了相应的语法格式:

上述语法由三部分组成: <>:事件类型必须包含在“尖括号”内;

modifier:可选项,事件类型的修饰符,通常用于描述组合键、双击、大写锁定键以及等;

type:是必不可少的一项,表示事件的具体类型;

detail:可选项,通常用于描述具体的哪个按键,比如 表示鼠标左键;

这里有必要对经常使用的 modifier 修饰符做简单的介绍,修饰符可以修改事件的激活条件,比如双击鼠标或者需要同时按下某个键才触发事件,常用的修饰符如下:

Control 事件发生时需按下 Control 键

Alt 事件发生时需按下 Alt 键

Shift 事件发生时需按下 Shift 键

Lock 事件发生时需处于大写锁定状态

Double 事件连续发生两次,比如双击鼠标

Triple 事件连续发生三次

Quadruple 事件连续发生四次

Tkinter 中经常使用的事件类型:

单击鼠标左键,简写为,后面的数字可以是1/2/3,分别代表左键、中间滑轮、右键

释放鼠标左键,后面数字可以是1/2/3,分别代表释放左键、滑轮、右键

按住鼠标左键移动,和分别表示按住鼠标滑轮移动、右键移动

转动鼠标滑轮

双击鼠标左键

鼠标光标进入控件实例

鼠标光标离开控件实例

按下键盘上的任意键

<KeyPress-字母>/<KeyPress-数字>按下键盘上的某一个字母或者数字键

释放键盘上的按键

回车键,其他同类型键有///空格键///方向键…常用的功能键组合键,再比如,表示用户同时点击 Ctrl + Shift + T当控件获取焦点时候触发

比如鼠标点击输入控件输入内容,可以调用 focus_set() 方法使控件获得焦点 当控件失去焦点时激活

比如当鼠标离开输入框的时候控件的发生改变的时候触发事件

比如调整了控件的大小等当控件的状态从“激活”变为“未激活”时触发事件

当控件被销毁的时候触发执行事件的函数

当窗口或组件的某部分不再被覆盖的时候触发事件

当应用程序至少有一部分在屏幕中是可见状态时触发事件

Event事件对象

当事件触发后,Tkinter 会自动将事件对象交给回调函数进行下步的处理 Event 对象包含常用属性:

widget 发生事件的是哪一个控件

x,y相对于窗口的左上角而言,当前鼠标的坐标位置

x_root,y_root 相对于屏幕的左上角而言,当前鼠标的坐标位置

char 用来显示所按键相对应的字符

keysym 查看按键名,比如 Control_L 表示左边的 Ctrl 按键keycode按键码,一个按键的数字编号,比如 Delete 按键码是107num1/2/3中的一个,表示点击了鼠标的哪个按键,按键分为左、中、右

width,height 控件的修改后的尺寸,对应着 事件type事件类型

from tkinter import *
# 定义事件函数,必须用event参数
def show_key(event):
    # 查看触发事件的按钮
    s=event.keysym
    # 将其显示在按钮控件上
    lb.config(text=s)
​
root=Tk()
root.geometry('450x350+300+200')
​
# 添加一个按钮控件
lb=Label(root,text='请按键',fg='blue',font=('微软雅黑',15))
# 给按钮控件绑定事件,按下任意键,然后调用事件处理函数。注意,此处需要在英文状态下进行输入
lb.bind('<Key>',show_key)
# 设置按钮获取焦点,这里必须使用这个
lb.focus_set()
lb.pack()
# 显示窗口
root.mainloop()

注意:只有当 Label 控件获取焦点后才能接收键盘事件,因此在给控件绑定事件和回调函数后,需要使用 focus_set() 方法来获取焦点。

# 定义事件函数
from tkinter import *
def handleMotion(event):
    lb1['text'] = '你移动了光标的所在位置'
    lb2['text'] = '目前光标位置:x ='+ str(event.x)+';y='+str(event.y)
    print('光标当前位置',event.x,event.y)
win = Tk()
win.config(bg='#87CEEB')
win.geometry('450x350+300+200')
# 创建一个窗体容器frame
frame = Frame (win, relief=RAISED, borderwidth=2, width=300,height=200)
frame.bind('<Motion>',handleMotion)
lb1 = Label(frame,text='没有任何事件触发', bg='purple', )
lb1.place (x=20,y=20)
lb2 = Label(frame,text='')
lb2.place (x=16,y=60)
frame.pack(side=TOP)
# 显示窗口
win.mainloop()

相关文章:

  • Windows10环境gradle安装与配置
  • DELMIA弧焊虚拟仿真:带变位机的机器人弧焊焊接程序自动生成方法
  • Redis 非关系型数据库学习(三)---- Redis 基础知识
  • 离线数仓(2):数据仓库相关架构和规范
  • MySQL-数据类型和DDL
  • Linux学习笔记6 - 系统启动流程
  • 动态数组写模板类
  • 代码错误与检查简短教程(新手适用)
  • Java Design Patterns 之API 网关模式
  • vue框架的基础语法之方法和事件的绑定,样式绑定,循环渲染,条件渲染
  • 项目第一天
  • go get 拉取报错The project you were looking for could not be found的解决方法
  • 算法题练习——NC15 求二叉树的层序遍历、NC88 寻找第K大
  • java基于springboot+vue的汉服推广与交流平台
  • 6面向对象中的继承
  • [nginx文档翻译系列] 控制nginx
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • C++11: atomic 头文件
  • Docker容器管理
  • Docker入门(二) - Dockerfile
  • leetcode386. Lexicographical Numbers
  • QQ浏览器x5内核的兼容性问题
  • Vue小说阅读器(仿追书神器)
  • vue中实现单选
  • 飞驰在Mesos的涡轮引擎上
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数组的操作
  • 我的业余项目总结
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​flutter 代码混淆
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Apache SeaTunnel 究竟是什么?
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (2)(2.10) LTM telemetry
  • (2015)JS ES6 必知的十个 特性
  • (27)4.8 习题课
  • (a /b)*c的值
  • (C++17) optional的使用
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (JS基础)String 类型
  • (SpringBoot)第二章:Spring创建和使用
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)库存超卖案例实战——优化redis分布式锁
  • .NET4.0并行计算技术基础(1)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NetCore部署微服务(二)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @RestController注解的使用
  • @开发者,一文搞懂什么是 C# 计时器!