'''
Created on 2017年9月1日

@author: Nick
'''
#_*_coding:utf-8_*_
import tkinter as tk
from tkinter import *

'''Tkinter之Event篇'''

#1、测试鼠标点击(Click)事件
# 分别测试鼠标的事件,回调函数的参数event中(x,y)表示当前点击的坐标值
def printEvent(event):
    print(event.x)
    print(event.y)
    
def printEvent_one(event):
    print('event.char = ',event.char)
    print('event.keycode = ',event.keycode)
    
# 分别测试鼠标的事件,回调函数的参数event中改变后的宽和高
def printSize(event):
    print('event.width = ',event.width)
    print('event.height = ',event.height)
    
    
    
if __name__ == '__main__':
    
    root = tk.Tk()
    root.wm_title('Event')
    root.wm_minsize(400, 400)#设置窗口最小化大小
    root.wm_maxsize(2800, 2800)#设置窗口最大化大小
    root.resizable(width=True, height=True)#设置窗口宽度不可变,高度可变
    
    fram1 = Frame(root)
    # <Button-1>:鼠标左击事件
    bt1 = Button(root,text = '鼠标左击事件')
    bt1.bind('<Button-1>',printEvent)
    # <Button-2>:鼠标中击事件
    bt2 = Button(root,text = '鼠标中击事件')
    bt2.bind('<Button-2>',printEvent)
    # <Button-3>:鼠标右击事件
    bt3 = Button(root,text = '鼠标右击事件')
    bt3.bind('<Button-3>',printEvent)
    # <Double-Button-1>:双击事件
    bt4 = Button(root,text = '鼠标双击事件')
    bt4.bind('<Double-Button-1>',printEvent)
    # <Triple-Button-1>:三击事件
    bt5 = Button(root,text = '鼠标三击事件')
    bt5.bind('<Triple-Button-1>',printEvent)
    
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    bt3.pack(side = LEFT)
    bt4.pack(side = LEFT)
    bt5.pack(side = LEFT)
    
    fram1.pack(side = TOP)
    
    #2、测试鼠标的移动(Motion)事件
    # 分别测试鼠标的移动事件,只有当鼠标被按下后移动才回产生事件
    fram2 = Frame(root)
    # <Bx-Motion>:鼠标移动事件,x=[1,2,3]分别表示左、中、右鼠标操作。
    bt1 = Button(fram2,text = '左移')
    bt1.bind('<B1-Motion>',printEvent)
    bt2 = Button(fram2,text = '中移')
    bt2.bind('<B2-Motion>',printEvent)
    bt3 = Button(fram2,text = '右移')
    bt3.bind('<B3-Motion>',printEvent) 
       
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    bt3.pack(side = LEFT)
    fram2.pack(side = TOP)
    
    
    #3、测试鼠标的释放(Relase)事件
    # 分别测试鼠标的Relase事件,只有当鼠标被Relase后移动才回产生Relase事件
    fram3 = Frame(root)
    # <ButtonRelease-x>鼠标释放事件,x=[1,2,3],分别表示鼠标的左、中、右键操作
    bt1 = Button(fram3,text = '左',fg = 'red')
    bt1.bind('<ButtonRelease-1>',printEvent)
    bt2 = Button(fram3,text = '中',fg = 'red')
    bt2.bind('<ButtonRelease-2>',printEvent)
    bt3 = Button(fram3,text = '右',fg = 'red')
    bt3.bind('<ButtonRelease-3>',printEvent) 
       
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    bt3.pack(side = LEFT)
    fram3.pack(side = TOP)
    
    
    #4、进入(Enter)事件
    # 分别测试Enter事件,只是在第一次进入进回产生事件,在组件中移动不会产生Enter事件。
    fram5 = Frame(root)
    # <Enter>:鼠标释放事件
    bt1 = Button(fram5,text = 'Enter事件',fg = 'green',relief = 'solid')
    bt1.bind('<Enter>',printEvent)
    
    bt1.pack(side = LEFT)
    fram5.pack(side = TOP)
    
    
    #5、测试离开(Leave)事件
    # 分别测试Leave事件,只是在离开组件是会产生此事件。
    fram6 = Frame(root)
    # leave:鼠标离开时产生此事件
    bt1 = Button(fram6,text = '离开事件',fg = 'blue',relief = 'ridge')
    bt1.bind('<Leave>',printEvent)
    
    bt1.pack(side = LEFT)
    fram6.pack(side = TOP)
    
    
    #6、响应特殊键(Special Key)
    # 键盘特殊键事件
    # 各个组件间焦点的切换可以使用TAB键。
    # 特殊键    Cancel/Break/BackSpace/Tab/Return/Sift_L/Shift_R/Control_L/Control_R/Alt_L/Alt_R/Pause
    # Caps_Loack/Escape/Prior(Page Up)/Next(Page Down)/End/Home/Left/Up/Right/Down/Print/Insert/Delete/
    # F1-12/Num_Lock/Scroll_Lock
    # 这些键的char是不可打印的,可以使用event.keycode查看。
    fram7 = Frame(root)
    # 创建第一个Button,并将它与BackSpace键绑定
    bt1 = Button(fram7,text = 'BackSpace事件',fg= 'red',relief = 'sunken')
    bt1.bind('<BackSpace>',printEvent_one)
    # 创建二个Button,并将它与回车键绑定
    bt2 = Button(fram7,text = 'Press Enter',fg= 'red',relief = 'sunken')
    bt2.bind('<Return>',printEvent_one)    
    # 创建第三个Button,并将它与F5键绑定
    bt3 = Button(fram7,text = 'F5事件',fg = 'red',relief = 'groove')
    bt3.bind('<F5>',printEvent_one)
    # 创建第4个Button,并将它与左Shift键绑定,与参考上说法一致
    bt4 = Button(fram7,text = '左 Shift事件',fg = 'red',relief = 'groove')
    bt4.bind('<Shift_L>',printEvent_one)    
    # 创建第5个Button,并将它与右Shift键绑定,与参考上说法一致
    bt5 = Button(fram7,text = '右 Shift+事件',fg = 'red',relief = 'groove')
    bt5.bind('<Shift_R>',printEvent_one) 
    
    # 将焦点设置到第1个Button上
    bt1.focus_set()
    
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    bt3.pack(side = LEFT)
    bt4.pack(side = LEFT)
    bt5.pack(side = LEFT)
    fram7.pack(side = TOP)
    

    #7、响应所有的按键(Key)事件
    # Key:处理所有的键盘事件
    # 处理所有的按键事件,如果是上例的特殊键,event.char返回为空;其它情况下为这个键的值。
    # 如果输入大写字母(即上档键值),按下Shift键时就会有Key的事件触发。即回将用两次:一次为Shift本身,另一次为Shift+ Kye的实际键值。
    fram8 = Frame(root)
    bt1 = Button(fram8,text = '所有键盘事件',fg = 'red',relief = 'groove')
    bt1.bind('<Key>',printEvent_one)
    
    bt1.focus_set()
    bt1.pack(side = LEFT)
    fram8.pack(side = TOP)

    
    #8、只处理指定的按键消息
    # 一般的按键直接使用就可以了,这样书写'key',不是'<key>';
    # 但有两个需要特别注意:空格与小于的处理,使用方式为'<space>和<less>
    fram9 = Frame(root)
    #a:只处理指定的按键消息
    # 创建第一个Button,并将它与键'a'绑定
    bt1 = Button(fram9,text = 'Press BackSpace',fg = 'blue',relief = 'groove')
    bt1.bind('a',printEvent_one)
    # 创建二个Button,并将它与按下spacebar是触发事件
    bt2 = Button(fram9,text = 'Press Spacebar',fg = 'blue',relief = 'groove')
    bt2.bind('<space>',printEvent_one)
    # 创建第三个Button,并将它与'<'键绑定    
    bt3 = Button(fram9,text = 'less than key',fg = 'blue',relief = 'groove')
    bt4.bind('<less>',printEvent_one)
    
    # 将焦点设置到第1个Button上
    bt1.focus_set()
    
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    bt3.pack(side = LEFT)
        
    fram9.pack(side = TOP)
    
    
    #9、使用组合键响应事件
    # 组合键(Control/Alt/Shift)
    # 使用Control/Alt/Shift与其它按键组合,但不能单独的使用Control/Alt组合。
    fram10 = Frame(root)
    # 创建第一个Button,并将它与键Shift - Up绑定
    bt1 = Button(fram10,text = 'Shift-up',fg = 'green',relief = 'groove')
    bt1.bind('<Shift-Up>',printEvent_one)
    # 创建二个Button,并将它与按下Control-Alt-a时触发事件
    bt2 = Button(fram10,text = 'Control-Alt-x',fg = 'green',relief = 'groove')
    bt2.bind('<Control-Alt-x>',printEvent_one)

    # 将焦点设置到第1个Button上
    bt1.focus_set()
    
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
#    bt3.pack(side = LEFT)
    fram10.pack(side = TOP)
    
    
    #10、改变组件大小事件
    # configure:改变组件大小事件
    # 当组件的大小改变时触发。evnet.width/height分别返回改变后的宽度和高度。
    fram11 = Frame(root)
    bt1 = Button(fram11,text = '改变组件大小',width = 10,height = 8,fg = 'red',relief = 'groove')
    bt1.bind('<Configure>',printSize)
    
    bt1.pack(side = LEFT)
    fram11.pack(side = TOP)
    
    
    #11、两个事件同时绑定到一个控件
    # bind:将事件与处理函数
    # 将两个事件绑定为同一个组件
    # 为Button绑定两个事件
    fram12 = Frame(root)
    bt1 = Button(fram12,text = '两个事件',fg = 'blue',relief = 'groove')
    # 当按键除了Return之外,都是由printSize来处理
    # 当按键为Return时,由printEvent_one来处理,即由最“近”的那个事件处理。
    bt1.bind('<Key>',printSize)
    bt1.bind('<Return>',printEvent_one)
    
    # 将焦点设置到第1个Button上
    bt1.focus_set()
    bt1.pack(side = LEFT)
    fram12.pack(side = TOP)
    
    
    #13、事件各个级别音传递
    # bind:绑定instance与toplevel
    # bind_class:绑定类处理函数
    # bind_all:绑定应用所有事件
    # 事件级别间”传递",Return向高级别进行了“传递",调用顺序为instance/class/toplevel/all
    fram13 = Frame(root)
    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 = Button(fram13,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.pack(side = LEFT)
    fram13.pack(side = TOP)
    
    
    #14、使用bind_class的后果
    # bind_class:绑定整个类的事件处理函数,将影响所有这个类的instance
    fram14 = Frame(root)
    def printClass(event):
        print('<bind_class>',event.keycode)
    
    # 改变button类的事件绑定
    root.bind_class('Button','<Return>',printClass)
    
    # 创建两个Button
    bt1 = Button(fram14,text = 'a button',fg = 'blue',relief = 'groove')
    bt2 = Button(fram14,text = 'another button',fg = 'blue',relief = 'groove')
    
    bt1.focus_set()
    
    bt1.pack(side = LEFT)
    bt2.pack(side = LEFT)
    fram14.pack(side = TOP)
    
    
    #15、使用protocal绑定
    # protocol:与WM交互,绑定事件处理函数。
    def printProtocol():
        print('WM_DELETE_WINDOW')
        root.destroy()
    # 使用protocol将WM_DELETE_WINDOW与printProtocol绑定
    # 程序在退出时打印'WM_DELETE_WINDOW'
    root.protocol('WM_DELETE_WINDOW',printProtocol)
    
  
    
    root.mainloop()
 


本文转载:CSDN博客