Python Tkinter 之事件关联(Python GUI 系列14)

Python Tkinter 之事件关联(Python GUI 系列14)

1. 序言

    本章介绍Tkinter的事件关联,本文是Python GUI系列的第14篇文章,整个系统约20篇博客,将全面的介绍Python Tkinter常用控件,最后还将基于Tkinter搭建两个比较完整的小项目。

2. 环境信息

********************************
本系列运行平台:Mac OS 10.13.4
Python 版本:3.6.4

********************************   

3.事件关联

    事件和绑定正如前几章提到的,Tkinter应用程序大部分事件都在事件循环中(通过mainloop方法进入事件循环)事件来自于多个来源,比如用户的键盘的输入和鼠标操作,和windowmanager的重绘事件(大多数情况下不是有用户直接调用的)。Tkinter提供强大的机制让您自己处理事件,每个组件你都可以为各种事件绑定python的函数和方法widget.bind(event,handler)如果组件中发生了与event描述匹配的事,将调用handler指定的处理程序。

    Windows编程是基于消息的,绝大多数界面编程是基于事件的。

    事件的绑定函数bind:

    语法:窗体对象.bind(事件类型,回调函数)

    所谓的“回调函数”,就是这个函数我们不用去调用它,当相应的事件发生的时候,它会自动取调用。比如当我们的按钮被按下的时候,它会被自动调用。

事件参数

说明

sequence

所绑定的事件;

func

所绑定的事件处理函数;

add

可选参数,为空字符或‘+’;

className

所绑定的类

鼠标键盘事件

<Button-1>

鼠标左键按下,2表示中键,3表示右键;

<ButtonPress-1>

同上

<ButtonRelease-1>

鼠标左键释放

<B1-Motion>

按住鼠标左键移动

<Double-Button-1>

双击左键

<Enter>

鼠标指针进入某一组件区域

<Leave>

鼠标指针离开某一组件区域

<MouseWheel>

滚动滚轮;

<KeyPress-A>

按下A键,A可用其他键替代

<Alt-KeyPress-A>

同时按下alt和A;alt可用ctrl和shift替代

<Double-KeyPress-A>

快速按两下A

<Lock-KeyPress-A>

大写状态下按A

<Control-V>

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

鼠标当前位置,相对于整个屏幕

4. 实例 

实例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("<Button-1>", 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('<Control-c>', 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”,输出圆形面积:




猜你喜欢

转载自blog.csdn.net/jin_kwok/article/details/80147822