tkinter -- Event(3)

发布时间:2018-06-09 13:44:28编辑:Run阅读(4951)

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

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

    代码:

    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

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

    结果:

    blob.png

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

    结果:

    blob.png

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

    结果:

    blob.png

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

    结果:

    blob.png

    程序在退出时打印'WM_DELETE_WINDOW'

关键字

上一篇: tkinter -- Event(2)

下一篇: tkinter实例