'''
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()
Tkinter之Event篇
本文转载:CSDN博客