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

modifier

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

modifier 含义
Alt 当按下 Alt 按键的时候
Any 1. 表示任何类型的按键被按下的时候
2. 例如 <Any-KeyPress> 表示当用户按下任何按键时触发事件
Control 当按下 Ctrl 按键的时候
Double 1. 当后续两个事件被连续触发的时候
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_L 64 左边的 Alt 按键
Alt_R 113 右边的 Alt 按键
BackSpace 22 Backspace(退格)按键
Cancel 110 break 按键
Caps_Lock 66 CapsLock(大写字母锁定)按键
Control_L 37 左边的 Ctrl 按键
Control_R 109 右边的 Ctrl 按键
Delete 107 Delete 按键
Down 104 ↓ 按键
End 103 End 按键
Escape 9 Esc 按键
Execute 111 SysReq 按键
F1 67 F1 按键
F2 68 F2 按键
F3 69 F3 按键
F4 70 F4 按键
F5 71 F5 按键
F6 72 F6 按键
F7 73 F7 按键
F8 74 F8 按键
F9 75 F9 按键
F10 76 F10 按键
F11 77 F11 按键
F12 96 F12 按键
Home 97 Home 按键
Insert 106 Insert 按键
Left 100 ← 按键
Linefeed 54 Linefeed(Ctrl + J)
KP_0 90 小键盘数字 0
KP_1 87 小键盘数字 1
KP_2 88 小键盘数字 2
KP_3 89 小键盘数字 3
KP_4 83 小键盘数字 4
KP_5 84 小键盘数字 5
KP_6 85 小键盘数字 6
KP_7 79 小键盘数字 7
KP_8 80 小键盘数字 8
KP_9 81 小键盘数字 9
KP_Add 86 小键盘的 + 按键
KP_Begin 84 小键盘的中间按键(5)
KP_Decimal 91 小键盘的点按键(.)
KP_Delete 91 小键盘的删除键
KP_Divide 112 小键盘的 / 按键
KP_Down 88 小键盘的 ↓ 按键
KP_End 87 小键盘的 End 按键
KP_Enter 108 小键盘的 Enter 按键
KP_Home 79 小键盘的 Home 按键
KP_Insert 90 小键盘的 Insert 按键
KP_Left 83 小键盘的 ← 按键
KP_Multiply 63 小键盘的 * 按键
KP_Next 89 小键盘的 PageDown 按键
KP_Prior 81 小键盘的 PageUp 按键
KP_Right 85 小键盘的 → 按键
KP_Subtract 82 小键盘的 - 按键
KP_Up 80 小键盘的 ↑ 按键
Next 105 PageDown 按键
Num_Lock 77 NumLock(数字锁定)按键
Pause 110 Pause(暂停)按键
Print 111 PrintScrn(打印屏幕)按键
Prior 99 PageUp 按键
Return 36 Enter(回车)按键
Right 102 → 按键
Scroll_Lock 78 ScrollLock 按键
Shift_L 50 左边的 Shift 按键
Shift_R 62 右边的 Shift 按键
Tab 23 Tab(制表)按键
Up 98 ↑ 按键

Tkinter:事件绑定相关推荐

  1. tkinter事件绑定方法总结

    1. 方法总结 tkinter中事件绑定方法可以分为两大类: 组件对象的绑定,包含2种方法: 通过command属性绑定,适合简单不需要获取event对象的情况, 例如:Button(root,tex ...

  2. python tkinter教程 博客园_python tkinter教程-事件绑定

    一个Tkinter主要跑在mainloop进程里.Events可能来自多个地方,比如按键,鼠标,或是系统事件. Tkinter提供了丰富的方法来处理这些事件.对于每一个控件Widget,你都可以为其绑 ...

  3. [译][Tkinter 教程15] event 事件绑定

    已获原作者授权. 原系列地址: Python Tkinter 简介 一个 Tkinter 应用生命周期中的大部分时间都处在一个消息循环 (event loop) 中. 它等待事件的发生: 事件可能是 ...

  4. Tkinter - events and bindings事件绑定

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

  5. python tkinter listbox_python tkinter listbox事件绑定

    我很难让事件绑定与python/tkinter一起工作.我只是试图点击并打印位置,但每次我这样做,"-1"是结果. 这是我的密码from Tkinter import * impo ...

  6. tkinter事件机制

    一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...

  7. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)

    Python做一个简易登录注册GUI界面 一,效果展示 (1)运行结果: (2)点击登录: 注:只有用户名:123 密码123456 会提示登录成功. 登录成功示范: 登录失败示范: (3)点击注册 ...

  8. python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    常用组件汇总 Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线.矩 ...

  9. Ant Design Pro 组件事件绑定 Input onChange

    Input 组件的 onChange 事件绑定语法 render() {this.shop_change = e => {const { value } = e.target;console.l ...

  10. java 绑定事件_Javascripts事件基础和事件绑定

    javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为 2.事件源 引发事件的元素(发生在谁身上) 3.事件处理的程序 对事件处理的程 ...

最新文章

  1. 用欧几里得算法求最大公约数_欧几里得算法:GCD(最大公约数),用C ++和Java示例解释...
  2. vs2010无法调试JS
  3. python菜鸟excel教程-Python操作Excel的Xlwings教程(一)
  4. 在csdn上如何快速转载博客
  5. Python类属性和实例属性分别是什么?
  6. vue项目使用webSocket前后端建立连接推送消息
  7. Redhat的Linux产品版本AS/ES/WS的联系与区别
  8. 产品经理必看:终于有人把数据指标讲明白了
  9. 万万没 想到,Redis性能测试还能这样做
  10. 胎压监测 (15 分)
  11. XCTest+XCTool
  12. 服务端性能测试入门指南
  13. 计算机考研自学,自学考研计算机
  14. 服务器ghost备份后无法进入系统还原,一键Ghost备份还原解决方法
  15. Python 进程 自定义进程子类 继承
  16. OpenResty+Lua实现WAF防火墙
  17. python如何实现微信自动聊天_如何利用python实现微信智能聊天功能,具体该怎么做?...
  18. 服务器性能管理系统,服务器系统性能管理是什么
  19. kernel 修改启动logo
  20. BLE(11)—— 细说 Initiating

热门文章

  1. c# - Owin Katana
  2. Android学生信息管理系统
  3. 洛谷 【入门4】数组 P1427 小鱼的数字游戏
  4. Pixhawk之启动代码和入口函数(.mk、rcS、__start、hrt)
  5. stm32f103c8t6--sd卡的读写flash地址空间的数据读取
  6. 在微信公众号中使用JQueryWeui组件实现文件上传
  7. 未来客服会被人工智能代替吗?
  8. 你能发现什么?又能坚持什么?
  9. 使用Matlab将多个图形Figure文件合并
  10. pcre2 知:介绍