本章介绍Tkinter的事件关联,本文是Python GUI系列的第14篇文章,整个系统约20篇博客,将全面的介绍Python Tkinter常用控件,最后还将基于Tkinter搭建两个比较完整的小项目。
********************************
本系列运行平台:Mac OS 10.13.4
Python 版本:3.6.4
********************************
事件和绑定正如前几章提到的,Tkinter应用程序大部分事件都在事件循环中(通过mainloop方法进入事件循环)事件来自于多个来源,比如用户的键盘的输入和鼠标操作,和windowmanager的重绘事件(大多数情况下不是有用户直接调用的)。Tkinter提供强大的机制让您自己处理事件,每个组件你都可以为各种事件绑定python的函数和方法widget.bind(event,handler)如果组件中发生了与event描述匹配的事,将调用handler指定的处理程序。
Windows编程是基于消息的,绝大多数界面编程是基于事件的。
事件的绑定函数bind:
语法:窗体对象.bind(事件类型,回调函数)
所谓的“回调函数”,就是这个函数我们不用去调用它,当相应的事件发生的时候,它会自动取调用。比如当我们的按钮被按下的时候,它会被自动调用。
事件参数 |
说明 |
sequence |
所绑定的事件; |
func |
所绑定的事件处理函数; |
add |
可选参数,为空字符或‘+’; |
className |
所绑定的类 |
鼠标键盘事件
鼠标左键按下,2表示中键,3表示右键; |
|
同上 |
|
鼠标左键释放 |
|
按住鼠标左键移动 |
|
双击左键 |
|
鼠标指针进入某一组件区域 |
|
鼠标指针离开某一组件区域 |
|
滚动滚轮; |
|
按下A键,A可用其他键替代 |
|
同时按下alt和A;alt可用ctrl和shift替代 |
|
快速按两下A |
|
大写状态下按A |
|
CTL 和V键被同时按下,V可以换成其它键位 |
窗口事件
Activate |
当组件由不可用转为可用时触发; |
Configure |
当组件大小改变时触发; |
Deactivate |
当组件由可用转变为不可用时触发; |
Destroy |
当组件被销毁时触发; |
Expose |
当组件从被遮挡状态中暴露出来时触发; |
Unmap |
当组件由显示状态变为隐藏状态时触发; |
Map |
当组件由隐藏状态变为显示状态时触发; |
FocusIn |
当组件获得焦点时触发; |
FocusOut |
当组件失去焦点时触发; |
Property |
当窗体的属性被删除或改变时触发; |
Visibility |
当组件变为可视状态时触发; |
响应事件
event |
对象def function(event)): |
char |
按键字符,仅对键盘事件有效; |
keycode |
按键名,仅对键盘事件有效; |
keysym |
按键编码,仅对键盘事件有效; |
num |
鼠标按键,仅对鼠标事件有效; |
type |
所触发的事件类型; |
widget |
引起事件的组件; |
width,heigh |
组件改变后的大小,仅Configure有效; |
x,y |
鼠标当前位置,相对于窗口; |
x_root,y_root |
鼠标当前位置,相对于整个屏幕 |
实例1:点击鼠标左键输出点击位置的坐标
from tkinter import*
myWindow = Tk()
myWindow.title("事件关联例子")
#点击鼠标左键,输出点击的位置坐标
def callback(event):
print("clicked at", event.x, event.y)
frame = Frame(myWindow, width=380, height=300)
frame.bind("", callback)
frame.pack()
myWindow.mainloop()
执行结果:点击不同位置输出的坐标值不一样
实例2:输入半径计算圆形面积,输入半径后,按下“CTL+v”即可输出面积值。
#导入tkinter
from tkinter import*
#键盘事件对应的响应函数
def printInfo(event):
#清理entry2
entry2.delete(0, END)
#根据输入半径计算面积
R=int(entry1.get())
S= 3.1415926*R*R
entry2.insert(10, S)
#清空entry2控件
entry1.delete(0, END)
#打印提示信息
def helpInfo():
entry2.delete(0, END)
entry2.insert(10, "同时按下ctl+c计算圆面积")
#初始化Tk()
myWindow = Tk()
#设置标题
myWindow.title('Python GUI Learning')
#标签控件布局
Label(myWindow, text="input").grid(row=0)
Label(myWindow, text="output").grid(row=1)
#Entry控件布局
entry1=Entry(myWindow)
entry2=Entry(myWindow)
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
#窗口绑定键盘事件
myWindow.bind('', printInfo)
#Quit按钮退出;Run按钮打印计算结果
Button(myWindow, text='Quit', command=myWindow.quit).grid(row=2, column=0, sticky=W, padx=5,pady=5)
Button(myWindow, text='help', command=helpInfo).grid(row=2, column=1, sticky=W, padx=5, pady=5)
#进入消息循环
myWindow.mainloop()
执行结果:
首先输入半径:2
然后,按下“ctl+c”,输出圆形面积: