tkinter -- Event(3)

两个事件同时绑定到一个控件

将两个事件绑定为同一个组件

代码:

import tkinter as tk
root = tk.Tk()
# 为 root 绑定两个事件
# Key 事件处理函数
def printEvent(event):
    print('<Key>',event.keycode)
# Return 事件处理函数
def printReturn(event):
    print('<Return>',event.keycode)

root.bind('<Key>',printEvent)
root.bind('<Return>', printReturn)

root.mainloop()

结果:

当按键除了 Return 之外,都是由 printEvent 来处理

当按键为 Return 时,由 printReturn 来处理,即由最“近”的那个事件处理

为一个 instance 绑定一个事件

instance 的 bind 方法

代码:

import tkinter as tk
root = tk.Tk()
# Key 事件处理函数
def printEvent(event):
    print('<Key>',event.keycode)
# Return 事件处理函数
def printReturn(event):
    print('<Return>',event.keycode)
# 使用 bt1来添加一个事件处理函数。
bt1 = tk.Button(root,text = 'instance event')
bt1.bind('<Key>', printEvent)
bt1.focus_set()
bt1.grid()
root.mainloop()

结果:

当按键时,程序调用一次 printEvent

事件各个级别音传递

事件级别间”传递"

代码:

import tkinter as tk
root = tk.Tk()
# Key 事件处理函数
def printEvent(event):
    print('<instance>',event.keycode)
# Return 事件处理函数
def printToplevel(event):
    print('<toplevel>',event.keycode)
def printClass(event):
    print('<bind_class>',event.keycode)
def printAppAll(event):
    print('<bind_all>',event.keycode)
# 在 instance 级别与 printEvent 绑定
bt1 = tk.Button(root,text = 'instance event')
bt1.bind('<Return>',printEvent)
# 在 bt1的 Toplevel 级别与 printToplevel 绑定
bt1.winfo_toplevel().bind('<Return>',printToplevel)
# 在 class 级别绑定事件 printClass
root.bind_class('Button','<Return>',printClass)
# 在 application all 级别绑定 printAppAll
bt1.bind_all('<Return>',printAppAll)
# 将焦点定位到 bt1上,回车一下,结果有4个打印输出。
bt1.focus_set()
bt1.grid()
root.mainloop()

结果:

Return 向高级别进行了“传递",调用顺序为 instance/class/toplevel/all

使用 bind_class 的后果

使用 bind_class 将影响所有这个类的 instance

代码:

import tkinter as tk
root = tk.Tk()

def printClass(event):
    print('<bind_class>',event.keycode)
# 改变 button 类的事件绑定
root.bind_class('Button','<Return>',printClass)
# 创建两个 Button
bt1 = tk.Button(root,text = 'a button')
bt2 = tk.Button(root,text = 'another button')
bt1.focus_set()
bt1.grid()
bt2.grid()
root.mainloop()

结果:

回车,bt1打印结果

TAB 切换到 bt2,回车同样打印出结果,即所有的 Button 对 Return 事件进行响应

使用 protocol 绑定

使用 protocol 与 WM 交互

代码:

import tkinter as tk
root = tk.Tk()
def printProtocol():
    print('WM_DELETE_WINDOW')
    root.destroy()
# 使用 protocol 将 WM_DELETE_WINDOW 与 printProtocol 绑定
root.protocol('WM_DELETE_WINDOW', printProtocol)
root.mainloop()

结果:

程序在退出时打印'WM_DELETE_WINDOW'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学自动化测试

Selenium2+python自动化73-定位的坑:class属性有空格

前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given s...

41840
来自专栏大数据

Vue.js常见问题精选(一)

一、数据绑定不一定就是使用双大括号 “{{}}” 语法 我们都知道,Vue.js 最常见的数据绑定方式是使用“Mustache”语法(双大括号),Angular...

23560
来自专栏AzMark

Python 学习之 Tkinter「下」

24550
来自专栏代码世界

前端之BOM和DOM

BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”。 DOM(Docu...

43550
来自专栏柠檬先生

jquery mobile 移动web(6)

jquery mobile 针对移动端设备的事件类型。   1.touch 事件。     tap 快速触摸屏幕并且离开,类似一种完整的点击操作。  ...

240100
来自专栏python成长之路

Pygame常用方法

70450
来自专栏liulun

自己动手写客户端UI库——事件机制(设计思路大放送)

在上一篇文章中我们创建了一个Button控件,并把这个控件显示在界面上, 在这一篇文章中,我们将为这个控件增加一个事件和一个方法 一:怎么绑定事件的问题 ...

21590
来自专栏前端说吧

vue - 父组件数据变化控制子组件类名切换

先说当时的思路和实现 核心是父子组件传值和v-bind指令动态绑定class实现

17210
来自专栏CIT极客

【奇淫巧技】Javascript入门笔记,打造最绚丽网页特效!

41960
来自专栏极客编程

vue.js快速上手

  Vue.js是一个构建数据驱动的web界面的库。技术上,它重点集中在MVVM模式的ViewModel层,因此它非常容易学习,非常容易与其它库或已有项目整合。

25930

扫码关注云+社区

领取腾讯云代金券