Tkinter之Event篇

来源:互联网 发布:win10杀毒软件知乎 编辑:程序博客网 时间:2024/05/17 17:39
'''Created on 2017年9月1日@author: Nick'''#_*_coding:utf-8_*_import tkinter as tkfrom 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() 

原创粉丝点击