前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tkinter -- Event(3)

tkinter -- Event(3)

作者头像
py3study
发布2018-08-03 10:59:30
4800
发布2018-08-03 10:59:30
举报
文章被收录于专栏:python3

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

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

代码:

代码语言:javascript
复制
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()

结果:

blob.png
blob.png

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

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

为一个 instance 绑定一个事件

instance 的 bind 方法

代码:

代码语言:javascript
复制
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()

结果:

blob.png
blob.png

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

事件各个级别音传递

事件级别间”传递"

代码:

代码语言:javascript
复制
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()

结果:

blob.png
blob.png

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

使用 bind_class 的后果

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

代码:

代码语言:javascript
复制
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()

结果:

blob.png
blob.png

回车,bt1打印结果

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

使用 protocol 绑定

使用 protocol 与 WM 交互

代码:

代码语言:javascript
复制
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()

结果:

blob.png
blob.png

程序在退出时打印'WM_DELETE_WINDOW'

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/06/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档