首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

tkinter -- Event(3)

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

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

代码:

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

结果:

当按键除了 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()

结果:

当按键时,程序调用一次 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()

结果:

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()

结果:

回车,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()

结果:

程序在退出时打印'WM_DELETE_WINDOW'

下一篇
举报
领券