Tkinter:事件绑定

正如我们此前提到的,一个 Tkinter 应用程序大部分时间花费在事件循环中(通过 mainloop() 方法进入)。事件可以有各种来源:包括用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户间接引起的)。

Tkinter 提供一个强大的机制可以让你自由地处理事件,对于每个组件来说,你可以通过 bind() 方法将函数或方法绑定到具体的事件上。

widget.bind(event, handler)

当被触发的事件满足该组件绑定的事件时,Tkinter 就会带着事件对象(Event)去调用 handler() 方法。

这儿有几个例子,大家请随意感受下:

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

# 捕获点击鼠标的位置
import tkinter as tkroot = tk.Tk()def callback(event):print("点击位置:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200)
frame.bind("<Button-1>", callback)
frame.pack()root.mainloop()

在上边这个例子中,我们使用 Frame 组件的 bind() 方法将鼠标点击事件(<Button-1>)和我们自定义的 callback() 方法绑定起来。那么运行后的结果是——当你在点击鼠标左键的时候,IDLE 会相应的将鼠标的位置显示出来(如上图)。

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

只有当组件获得焦点的时候才能接收键盘事件(Key),下边例子中我们用 focus_set() 获得焦点,当你你可以设置 Frame 的 takefocus 选项为 True,然后使用 Tab 将焦点转移上来。

# 捕获键盘事件
import tkinter as tkroot = tk.Tk()def callback(event):print("点击的键盘字符为:", event.char)frame = tk.Frame(root, width = 200, height = 200)
frame.bind("<Key>", callback)
frame.focus_set()
frame.pack()root.mainloop()

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

# 捕获鼠标在组件上的运动轨迹
import tkinter as tkroot = tk.Tk()def callback(event):print("当前位置为:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200)
frame.bind("<Motion>", callback)
frame.pack()root.mainloop()


下方主要内容:

  1. 事件序列
  2. type
  3. modifier
  4. Event 对象
  5. Key names

事件序列

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.rhkb.cn/news/58722.html

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

相关文章

简单跳转绑定(按钮)

第一行那个是绑定跳转到这个网页的msg里面的值 第二行那个是跳转到页面 第三行是调用/logout方法

关联账号登录验证绑定设计

文章在保证设计思路的情况下&#xff0c;已隐去了原有的项目名称&#xff0c;把项目名称和数据库字段也使用了别名代替。如有类似关联账户需求设计&#xff0c;可参考本篇设计&#xff0c;实现自己的需求即可。 一、背景 备注&#xff1a;以下 对私的客户端&#xff08;个人业…

关于修改手机绑定那些事!

前言&#xff1a; 最近由于各种各样的原因&#xff0c;注销了使用五六年的手机号码&#xff01;本来更换手机号码是一件很简单的事情&#xff0c;但是&#xff0c;由于是原手机号码注销&#xff0c;这个时候很多APP需要完成新的手机号绑定&#xff0c;但是由于无法接收旧号码的…

TestHome 注册?如何绑定微信?如何激活账号?

社区主账号是邮箱&#xff0c;一个邮箱可以同时绑定微信和 github&#xff01; 你可以进行解绑&#xff1a;https://testerhome.com/setting/account 重要的事情&#xff0c;说三遍&#xff0c;所以你需要保证你的邮箱是可以用邮箱和密码来登录的。 如果你已经设置过密码&…

教大家免费获得小白无障碍语音AI助手时间点数

相信大家已经用过小白AI字幕了&#xff0c;也就是小白无障碍语音AI助手&#xff0c;它凭借出色的视频字幕拾取与翻译功能&#xff0c;赢得了不少好评&#xff0c;特别是给听障人士带来了福音&#xff0c;让其能够正常观看视频&#xff0c;同时也能将英语&#xff0c;日韩视频提…

你可能需要一个语音红包小助手(计算机语音)

这个小东西是大二寒假&#xff0c;似乎同学们都很有钱&#xff0c;而我在这个寒假似乎挺穷的&#xff0c;天天看着群里发语音红包。。。。。 而我呢&#xff0c;身为一个弗兰人&#xff01;&#xff01;&#xff01;&#xff01; l n 不分 h f 不分 前鼻音后鼻音不分…

Python调用Mac的语音助手进行声音播放

在学习Python的时候&#xff0c;看到Windows上调用了winsound模块进行蜂鸣器的声音输出&#xff0c;但是当我把代码放在Mac上运行时报错了 解决问题 代码如下&#xff1a; import winsound winsound.Beep(1000, 3000)错误信息如下&#xff1a; 原因是winsound需要基于Windows…

WPF 实现3维图片墙相关展示效果(凹面墙,凸面墙)

因为需求&#xff0c;需要做3维图片墙的相关展示效果&#xff0c;如凹面墙&#xff0c;凸面墙。由于WPF也不会&#xff08;会一点C#&#xff09;&#xff0c;3D编程一点也不会&#xff0c;一切从零开始学习&#xff0c;看了《精通Windows3D图形编程》一书和参考了网上相关的资料…

【WPF】 免费图表控件的比较 (OxyPlot,LiveChart,ScottPlot,MsChart)

indowsForm平台下创建图表、Visual Studio 自带的Chart很有名气、但是在WPF平台下却不支持。 2016年左右&#xff0c;WPT Toolkit组件中提供了&#xff08;WPF Toolkit Data Visualization Controls&#xff09;&#xff0c;但是现在似乎也已弃用。 在业务中&#xff0c;我需…

甘特图控件DHTMLX Gantt教程:用PHP:Laravel实现Gantt(上)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

C# Winform酒店管理系统根据数据库动态加载房间生成房态图的制作效果(附图且详细)

酒店管理系统根据数据库动态加载房间生成房态图的制作 先放一张效果图&#xff1a; 因为要动态加载房态图&#xff0c;需要遍历每一个小房间&#xff0c;所以我定义了一个自定义控件&#xff0c;大概是这个样子的&#xff0c; 首先创建一个自定义控件&#xff0c;然后我们来…

MFC 关于OnPaint绘图的一些经验

问题描述&#xff1a; 在MFC中在对话框上绘图时&#xff0c; 要求按下按钮绘制相关图形&#xff0c; 写好绘制函数调用调试时&#xff0c;发现若是改变对话框的界面大小或者最小化/最大化或者有隐藏时会导致图形消失。 原因分析&#xff1a; 改变对话框的界面大小或者最小化…

聊一聊过度设计!

文章目录 什么是过度设计&#xff1f;过度设计的坏处如何避免过度设计充分理解问题本身保持简单小步快跑征求其他人的意见 总结 新手程序员在做设计时&#xff0c;因为缺乏经验&#xff0c;很容易写出欠设计的代码&#xff0c;但有一些经验的程序员&#xff0c;尤其是在刚学习过…

毕业5年了还不知道Android热修复?

/ 今日科技快讯 / 近日&#xff0c;谷歌抢在微软之前发布了ChatGPT竞品、自家人工智能聊天机器人Bard&#xff0c;但市场反应并不好。谷歌员工们纷纷批评包括首席执行官桑德尔皮查伊在内的公司领导层&#xff0c;认为公司本周宣布推出Bard的方式过于“仓促”、简直是“一团…

输出国际象棋棋盘

##1、程序分析 国际象棋是8*8的&#xff0c;i(07)代表行&#xff0c;j(07)代表列。当ij为奇数的时候&#xff0c;是黑色格子&#xff0c;反之&#xff0c;白色格子。 ##2、程序实现 方法一&#xff1a;两重循环 &#xff08;1&#xff09;程序&#xff1a; for i in range(8…

java简单实现中国象棋

java简单实现中国象棋 可以实现简单的人机对战功能&#xff0c;棋子移动会插入关键帧&#xff0c;可以悔棋等功能 运行效果 import java.awt.Canvas; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import ja…

Qt实现中国象棋:(七)悔棋

一、下棋步骤的保存 在设置保存下棋步骤之前&#xff0c;先定义一个bool类型的变量player用于判定是哪一方下子&#xff0c;设定playertrue时是红方下棋&#xff0c;playerfalse时是黑方下棋。 1:要想保存下棋的步骤&#xff0c;必须先弄明白需要保存的信息。一个下棋步骤需要…

三种版本的中国象棋

一.图片资源&#xff1a; 二.图片存放位置&#xff1a; 三.三种不同版本的中国象棋源代码 三种源代码运行之前都需要 点击项目-属性 找到这个地方&#xff0c;把字符集改成“使用多字节字符集”&#xff1a; 一.版本1&#xff1a;中国象棋简洁版&#xff08;部分特效无…

Pygame实战:中国象棋人机对抗赛今开战、谁占上风?要不要来一盘试试?

&#x1f333;导语 哈喽&#xff01;哈喽&#xff01;我是木木子&#xff01;今日游戏更新——中国象棋上线啦&#xff01; 中国象棋是一种古老的棋类游戏&#xff0c;大约有两千年的历史。 是中华文明非物质文化经典产物&#xff0c;艺术价值泛属于整个人类文明进化史的一个…

Java实现中国象棋(人机对战)

目录 简介 成品视频 实现思路 界面实现分为了三块 棋盘抽象类 按钮组抽象类 棋子绘制接口 棋盘界面实现 棋子的实现 按钮组的实现 监听工厂和监听类 棋盘绘制类的实现 开始游戏实现 停止游戏实现 游戏抽象类 游戏实现类 可走路线和吃棋判断实现 车(ju) 炮 …