两个事件同时绑定到一个控件
将两个事件绑定为同一个组件
代码:
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'