《零基础入门学习Python》第074讲:GUI的终极选择:Tkinter11

news2024/11/25 18:38:18

今天我们来讲讲 事件绑定。正如我们此前所提到的,一个 tkinter 的应用程序大部分时间是花费在事件循环中的,也就是通过 mainloop() 方法进入时间循环了,事件可以有各种各样的来源,比如说 用户移动、点击一下鼠标,会产生对应的鼠标事件,在键盘上一个敲击,会产生对应的按键事件,拖动或者改变应用程序的大小,窗口管理器也会触发相应的重绘事件啦。

tkinter 提供一个非常强大的机制可以让你自由的去管理这些事件,定义这些事件的操作,对每一个组件来说,你可以通过 bind() 方法将自己定义的函数或者方法绑定到具体的事件上,我们在此之前已经演示过很多次啦,当被触发的事件满足该组件绑定的事件的时候,tkinter 就会带着事件本身的描述去调用自定义的方法了,我们这里有几个例子给大家感受一下。

第一个是关于鼠标按键的演示:

我们创建一个框架 frame ,然后在这个框架里响应事件就可以了,宽度、高度均为200,<Button-1>,中间有一个小横杠,左边是事件本身,右边是事件的描述,Button 表示鼠标的点击事件,1 表示鼠标左键(2:中间键;3:右键;4和5是对于Linix 系统才有用,对应滚轮的上滚和下滚),我们对这个事件绑定一个自定义的方法:callback(),我们说,当触发 Button-1 这个事件(即点击鼠标左键)的时候,tkinter 会带着事件本身去调用 callback() 方法,它就把这个事件传到这个方法的参数里面,我们这里就需要一个形参来获取,这里命名为 event,用其他名字也一样,event 形参来获取对应的事件描述,我们就简单的把点击那一刻鼠标的位置打印出来,event.x和event.y,这里的x,y 表示的是相对于应用程序左上角的相对位置,还有一个 root.x 和 root.y,是相对于屏幕的位置。我们下面介绍。

 
  1. # 捕获点击鼠标的位置

  2. import tkinter as tk

  3. root = tk.Tk()

  4. def callback(event):

  5. print("点击位置:", event.x, event.y)

  6. frame = tk.Frame(root, width = 200, height = 200)

  7. frame.bind("<Button-1>", callback)

  8. frame.pack()

  9. root.mainloop()

运行结果也表明了:越接近左上角越接近于0。

第二个是关于键盘按键的演示:

键盘相应的是 Key,也可以是 KeyPress(键盘按下),其实,有按下就有释放的过程,像刚才的 Button,也有ButtonRelease,这里总之响应一个 Key 就可以了,关于键盘的事件,有一个特别的要求,就是说,你这个组件想要响应键盘事件,因为一个窗口可能会有很多组件,键盘一次敲击,也不知道给哪个组件,所以他有一个要求,就是你这个组件必须获得焦点,它才会响应键盘来的消息,那怎么获取焦点呢?我们可以设置 Frame 的 takefocus 选项为 True,然后运行时使用 Tab 将焦点转移上来。这里有一个更便捷的方法:用 focus_set() 获得焦点。键盘有一个 char 属性,就是你刚才按下的字符。

 
  1. # 捕获键盘事件

  2. import tkinter as tk

  3. root = tk.Tk()

  4. def callback(event):

  5. print("点击的键盘字符为:", event.char)

  6. frame = tk.Frame(root, width = 200, height = 200)

  7. frame.bind("<Key>", callback)

  8. frame.focus_set()

  9. frame.pack()

  10. root.mainloop()

但是上面的例子中,当我们点击 ALT、Ctrl、Shift 这一类特殊按键时,就不会显示,但是可以通过 把 event.char 改为 event.keysym 或者 event.keycode 来得到对应按键的 keysym 和 keycode(参照下面的Key names小节

最后我们再用一个例子展示捕获鼠标在组件上的运动轨迹,这里需要关注的是 <Motion> 事件:

 
  1. # 捕获鼠标在组件上的运动轨迹

  2. import tkinter as tk

  3. root = tk.Tk()

  4. def callback(event):

  5. print("当前位置为:", event.x, event.y)

  6. frame = tk.Frame(root, width = 200, height = 200)

  7. frame.bind("<Motion>", callback)

  8. frame.pack()

  9. root.mainloop()

截止目前为止,我们都是泛泛的跟大家说怎么用,现在我们主要谈一下语法性的东西啦,首先,我们刚才的Button、Key、KeyPress、Motion 都称之为 时间序列。

Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(如果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)。

事件序列使用以下语法描述:

<modifier-type-detail>

  • 事件序列是包含在尖括号(<...>)中
  • type 部分的内容是最重要的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击(详见下方)。
  • modifier 部分的内容是可选的,它通常用于描述组合键,例如 Ctrl + c,Shift + 鼠标左键点击(详见下方)。
  • detail 部分的内容是可选的,它通常用于描述具体的按键,例如 Button-1 表示鼠标左键。

举几个例子帮助大家消化:

事件序列含义
<Button-1>用户点击鼠标左键
<KeyPress-H>用户点击 H 按键
<Control-Shift-KeyPress-H>用户同时点击 Ctrl + Shift + H

type

type含义
Activate当组件的状态从“未激活”变为“激活”的时候触发该事件
Button1. 当用户点击鼠标按键的时候触发该事件
2. detail 部分指定具体哪个按键:<Button-1>鼠标左键,<Button-2>鼠标中键,<Button-3>鼠标右键,<Button-4>滚轮上滚(Linux),<Button-5>滚轮下滚(Linux)
ButtonRelease1. 当用户释放鼠标按键的时候触发该事
2. 在大多数情况下,比 Button 要更好用,因为如果当用户不小心按下鼠标,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件
Configure当组件的尺寸发生改变的时候触发该事件
Deactivate当组件的状态从“激活”变为“未激活”的时候触发该事件
Destroy当组件被销毁的时候触发该事件
Enter1. 当鼠标指针进入组件的时候触发该事件
2. 注意:不是指用户按下回车键
Expose当窗口或组件的某部分不再被覆盖的时候触发该事件
FocusIn1. 当组件获得焦点的时候触发该事件
2. 用户可以用 Tab 键将焦点转移到该组件上(需要该组件的 takefocus 选项为 True)
3. 你也可以调用 focus_set() 方法使该组件获得焦点(见上方例子)
FocusOut当组件失去焦点的时候触发该事件
KeyPress1. 当用户按下键盘按键的时候触发该事件
2. detail 可以指定具体的按键,例如 <KeyPress-H>表示当大写字母 H 被按下的时候触发该事件
3. KeyPress 可以简写为 Key
KeyRelease当用户释放键盘按键的时候触发该事件
Leave当鼠标指针离开组件的时候触发该事件
Map1. 当组件被映射的时候触发该事件
2. 意思是在应用程序中显示该组件的时候,例如调用 grid() 方法
Motion当鼠标在组件内移动的整个过程均触发该事件
MouseWheel1. 当鼠标滚轮滚动的时候触发该事件
2. 目前该事件仅支持 Windows 和 Mac 系统,Linux 系统请参考 Button
Unmap1. 当组件被取消映射的时候触发该事件
2. 意思是在应用程序中不再显示该组件的时候,例如调用 grid_remove() 方法
Visibility当应用程序至少有一部分在屏幕中是可见的时候触发该事件

modifier

在事件序列中,modifier 部分的内容可以是以下这些:

modifier含义
Alt当按下 Alt 按键的时候
Any1. 表示任何类型的按键被按下的时候
2. 例如 <Any-KeyPress> 表示当用户按下任何按键时触发事件
Control当按下 Ctrl 按键的时候
Double1. 当后续两个事件被连续触发的时候
2. 例如 <Double-Button-1> 表示当用户双击鼠标左键时触发事件
Lock当打开大写字母锁定键(CapsLock)的时候
Shift当按下 Shift 按键的时候
Triple跟 Double 类似,当后续三个事件被连续触发的时候

Event 对象

当 Tkinter 去回调你定义的函数的时候,都会带着 Event 对象(作为参数)去调用,Event 对象以下这些属性你可以使用:

属性含义
widget产生该事件的组件
x, y当前的鼠标位置坐标(相对于窗口左上角,像素为单位)
x_root, y_root当前的鼠标位置坐标(相对于屏幕左上角,像素为单位)
char按键对应的字符(键盘事件专属)
keysym按键名,见下方 Key names(键盘事件专属)
keycode按键码,见下方 Key names(键盘事件专属)
num按钮数字(鼠标事件专属)
width, height组件的新尺寸(Configure 事件专属)
type该事件类型

Key names

当事件为 <Key>,<KeyPress>,<KeyRelease> 的时候,detail 可以通过设定具体的按键名(keysym)来筛选。例如 <Key-H> 表示按下键盘上的大写字母 H 时候触发事件,<Key-Tab> 表示按下键盘上的 Tab 按键的时候触发事件。

下表列举了键盘所有特殊按键的 keysym 和 keycode:
(下边按键码是对应美国标准 101 键盘的“Latin-1”字符集,键盘标准不同对应的按键码不同,但按键名是一样的)

按键名(keysym)按键码(keycode)代表的按键
Alt_L64左边的 Alt 按键
Alt_R113右边的 Alt 按键
BackSpace22Backspace(退格)按键
Cancel110break 按键
Caps_Lock66CapsLock(大写字母锁定)按键
Control_L37左边的 Ctrl 按键
Control_R109右边的 Ctrl 按键
Delete107Delete 按键
Down104↓ 按键
End103End 按键
Escape9Esc 按键
Execute111SysReq 按键
F167F1 按键
F268F2 按键
F369F3 按键
F470F4 按键
F571F5 按键
F672F6 按键
F773F7 按键
F874F8 按键
F975F9 按键
F1076F10 按键
F1177F11 按键
F1296F12 按键
Home97Home 按键
Insert106Insert 按键
Left100← 按键
Linefeed54Linefeed(Ctrl + J)
KP_090小键盘数字 0
KP_187小键盘数字 1
KP_288小键盘数字 2
KP_389小键盘数字 3
KP_483小键盘数字 4
KP_584小键盘数字 5
KP_685小键盘数字 6
KP_779小键盘数字 7
KP_880小键盘数字 8
KP_981小键盘数字 9
KP_Add86小键盘的 + 按键
KP_Begin84小键盘的中间按键(5)
KP_Decimal91小键盘的点按键(.)
KP_Delete91小键盘的删除键
KP_Divide112小键盘的 / 按键
KP_Down88小键盘的 ↓ 按键
KP_End87小键盘的 End 按键
KP_Enter108小键盘的 Enter 按键
KP_Home79小键盘的 Home 按键
KP_Insert90小键盘的 Insert 按键
KP_Left83小键盘的 ← 按键
KP_Multiply63小键盘的 * 按键
KP_Next89小键盘的 PageDown 按键
KP_Prior81小键盘的 PageUp 按键
KP_Right85小键盘的 → 按键
KP_Subtract82小键盘的 - 按键
KP_Up80小键盘的 ↑ 按键
Next105PageDown 按键
Num_Lock77NumLock(数字锁定)按键
Pause110Pause(暂停)按键
Print111PrintScrn(打印屏幕)按键
Prior99PageUp 按键
Return36Enter(回车)按键
Right102→ 按键
Scroll_Lock78ScrollLock 按键
Shift_L50左边的 Shift 按键
Shift_R62右边的 Shift 按键
Tab23Tab(制表)按键
Up98↑ 按键

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

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

相关文章

git常用命令速查表

1.git add -u [<路径>]: 把<路径>中所有跟踪&#xff08;tracked&#xff09;文件中被修改过或已删除文件的信息添加到索引库。它不会处理未跟踪&#xff08;untracked&#xff09;的文件。省略<路径>表示&#xff1a;即当前目录。 2.git add -a [<路径&…

BGP属性+选路规则

目录 一&#xff0c;BGP的属性—基础属性 1.PrefVal 2.LocPrf 3、优先本地下一跳 &#xff08;NextHop&#xff09; 4、AS-PATH 5、起源属性 6、MED -多出口鉴别属性 二&#xff0c;BGP选路规则 三&#xff0c;BGP的社团属性 一&#xff0c;BGP的属性—基础…

埃隆马斯克五步工作法丨IDCF

作者&#xff1a;徐磊 文章首发地址&#xff1a;https://smartide.cn/zh/blog/2022-0707-elonmusk-5steps/ 埃隆马斯克在2021年被福布斯杂志评选为世界首富&#xff0c;截至2022年7月他的个人财富为2214亿美金&#xff0c;他同时也是多家公司的CEO&#xff0c;包括&#xff1a…

便利生活,探索上门家政小程序的必备功能与用户体验

上门家政小程序是一种方便用户在线预约家政服务的应用程序。下面将介绍一下开发上门家政小程序时的必备功能&#xff0c;以及这些功能如何提供便利和增加用户体验。   在线预约功能&#xff1a;上门家政小程序提供了在线预约平台&#xff0c;用户可以通过手机随时随地选择需要…

Linux命令(56)之ifconfig

Linux命令之ifconfig 1.ifconfig介绍 linux命令ifconfig可以用来查看网卡信息&#xff0c;启停网卡&#xff0c;设置网络IP等&#xff0c;基于实际运维场景&#xff0c;我们就来说说ifconfig普遍的常规用法 2.ifconfig用法 ifconfig [网络设备名称] [参数] ifconfig参数 参…

try catch 应该在for循环里面还是外面

使用场景 为什么要把 使用场景 摆在第一个 &#xff1f; 因为本身try catch 放在 for循环外面和里面&#xff0c;如果出现异常&#xff0c;产生的效果是不一样的。 怎么用&#xff0c;就需要看好业务场景&#xff0c;去使用了。 ① try catch在for循环外面 代码示例 &…

免费Scrum工具,Scrum敏捷研发管理流程

Leangoo领歌它覆盖了敏捷项目研发全流程&#xff0c;包括小型团队Scrum敏捷开发&#xff0c;规模化敏捷SAFe&#xff0c;Scrum of Scrums大规模敏捷。它提供了灵活的敏捷模板和极致的协作体验&#xff0c;可以让团队快速上手&#xff0c;快速落地Scrum敏捷开发管理。 首先建立产…

Arcgis 分区统计majority参数统计问题

利用Arcgis 进行分区统计时&#xff0c;需要统计不同矢量区域中栅格数据的众数&#xff08;majority&#xff09;&#xff0c;出现无法统计majority参数问题解决 解决&#xff1a;利用copy raster工具&#xff0c;将原始栅格数据 64bit转为16bit

Blazor第三方组件库推荐:BootstrapBlazor UI

文章目录 前言资源适合人群如何开始环境配置开始新项目Server和Wasm的区别.NET CORE 不支持 7.0运行结果 使用组件发布项目配置到IIS里面 前言 Blazor是C#全栈追求极致开发速度的一个前后端不分离的框架&#xff0c;上限是在Winform,WPF,MAUI等宿主环境上面运行的全平台引用。…

给你一把钥匙,教你如何实时翻译网课语音

嘿&#xff01;你是否曾经遇到过参加过一节精彩的录播课程&#xff0c;但因为语言不通而错失了许多重要内容的情况&#xff1f;或许你也曾因无法即时和老师互动而感到遗憾。别担心&#xff01;我将带你探索一个令人兴奋的解决方案——语音翻译&#xff01;这项神奇的技术能够让…

时间复杂度为O(n2)的三种简单排序算法

1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置&#xff0c;重复n次&#xff0c;就完成了n个数据的排序工作。 /*** …

通用商城项目(中)

金山编译器出问题了。下面段落标号全出问题了&#xff0c;排版也出问题了。懒得改了。 使用对象存储OSS&#xff0c;保存品牌logo 新建Module&#xff0c;提供上传、显示服务 有些不明所以的&#xff0c;按照steinliving-commodity配置了一通pom.xml 新建application.yml&…

下载离线版的VS Visual Studio 并下载指定的版本

一、先下载引导程序 下载地址VS VisualStudio官网 在这个页面翻到最下面 在这里下载需要的版本 下载引导程序 二、下载离线安装包 写一个批处理文件&#xff08;vs.bat&#xff09; 命令格式如下 <vs引导程序exe> --layout <离线安装包下载的路径> --add <功能…

EMS SQL Manager for MySQL Crack

EMS SQL Manager for MySQL Crack 用于MySQL的EMS SQL Manager是用于MySQL数据库管理和开发的高性能工具。它适用于4.1到最新版本的任何MySQL&#xff0c;并支持所有最新功能&#xff0c;包括MySQL触发器、视图、存储过程和函数、InnoDB外键、Unicode数据等。SQL Manager for M…

策略新高,牛回速归?

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;今天我们来聊一下&#xff0c;股票社群策略绩效实盘总结。 众所周知&#xff0c;2023年我们开设了新的社群——股票社群。该社群宗旨是在尽可能简单有效逻辑下&#xff0c;降低因子复…

HTML5 API 多端通信桥 MessageChannel 技术

这个特别有意思&#xff0c;可以将其理解为通信桥的概念&#xff0c;桥有两个端&#xff08;port1&#xff0c;port2&#xff09;只要将port1&#xff0c;port2指定到任意两个进程&#xff0c;无论是iframe-iframe&#xff0c;iframe-worker&#xff0c;parent-child-iframe&am…

制作crate并发布到Crates.io

准备 发布 crate 时, 一旦发布无法修改,无法覆盖, 因此要注意邮箱等一些个人信息 访问crates.io 的 帐号设定页面[1],生成Token 并在命令行 执行 cargo login your token 此命令将告诉 Cargo 你的 API 令牌, 并将其存储在本地 ~/.cargo/credentials crates.io 上crate的名字, 会…

Linux知识点 -- 基础IO(三)

Linux知识点 – 基础IO&#xff08;三&#xff09; 文章目录 Linux知识点 -- 基础IO&#xff08;三&#xff09;一、理解文件系统1.磁盘文件2.文件系统的存储结构3.inode与文件名的关系 二、软硬链接1、软链接2.硬链接 三、动静态库1.库2.生成静态库3.静态库的使用4.生成动态库…

山西电力市场日前价格预测【2023-08-02】

日前价格预测 预测明日&#xff08;2023-08-02&#xff09;山西电力市场全天平均日前电价为323.97元/MWh。其中&#xff0c;最高日前电价为360.30元/MWh&#xff0c;预计出现在20: 00。最低日前电价为295.41元/MWh&#xff0c;预计出现在13: 30。 价差方向预测 1&#xff1a;实…

SQL-进阶

mysql --local-infile -u root -pset global local_infile 1;load data local infile 目录 into able 表名 fields terminated by , lines terminated by \n;