使用tkinter实现桌面电子时钟,时钟显示日期(年月日)和时间(时分秒),时钟窗口置顶,并且可以用鼠标左键拖动位置,点击鼠标右键结束程序。实验效果如下:
熟练掌握tkinter组件的操作
熟练掌握tkinter事件触发原理和实现方式
Tkinter(也叫 Tk 接口)是 Tk 图形用户界面工具包标准 的 Python 接口。Tk 是一个轻量级的跨平台图形用户界面 (GUI)开发工具。 Tk 和 Tkinter 可以运行在大多数 的 Unix 平台、Windows、和 Macintosh 系统。
Tkinter 由一定数量的模块组成。 Tkinter 位于一个名为 _tki nter(较早的版本名为 tki nter)的二进制模块中 。 Tkinter 包含了对 Tk 的低级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或 DLL), 但是在一些情况下它也被 Python 解释器静态链接。
一个 Tkinter 应用程序大部分时间是花在事件循环当中的,也就是通过 mainloop() 进入的事件循环。
事件可以有各种来源:用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户简介引起的),Tkinter 给我们提供了一个强大的机制去管理这些事件,去定义这些事件的操作。对每一个组件来说,可以通过 bind() 的方法来将自己定义的函数或方法绑定到具体的事件上。
widget.bind(event, handler)
当被触发的事件满足该组件绑定的事件的时候,Tkinter 就会带着事件对象(Event、事件本身的描述)去调用自定义的 handler() 方法。
Tkinter鼠标事件类型:
事件类型代码 | 事件类型 |
---|---|
<1> = |
鼠标左键单击 |
<2> = |
鼠标中键单击 |
<3> = |
鼠标右键单击 |
鼠标左键拖动 | |
鼠标中键拖动 | |
鼠标右键拖动 | |
鼠标左键释放 | |
鼠标中键释放 | |
鼠标右键释放 | |
鼠标左键双击 | |
鼠标中键双击 | |
鼠标右键双击 | |
鼠标在某个按键被按下时的移动事件 | |
鼠标指针进入控件 | |
鼠标指针离开控件 |
以上只展示了鼠标事件和事件类型代码,除了鼠标事件之外,还有键盘事件、窗体事件等。同学可以自行查阅资料了解。
Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需要使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(若果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)。
事件序列使用以下语法描述:
事件序列是包含在尖括号(<…>)中的
type部分的内容是必须的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击
modifier部分的内容是可选的,它通常用于描述组合键,例如Ctrl + c(
detail部分的内容是可选的,它通常用于描述具体的按键,例如Button-1表示的是鼠标左键,
事件序列
事件序列
事件序列
type如下:
TYPE | 描述 |
---|---|
Active | 当组件的状态从“未激活”变为“激活”的时候触发该事件 |
Button | 当用户点击鼠标按键的时候触发该事件,detail部分指定是具体用哪个键: |
ButtonRelease | 当用户释放鼠标按键的时候触发该事件,在大多数情况下,比Button要更好使用,因为如果当用户不小心按下鼠标键,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件 |
Configure | 当组件的尺寸改变的时候触发该事件(窗口管理器触发的重绘事件,当你调整组件的尺寸或者移动应用程序,组件会和窗口一样被重绘) |
Deactivate | 当组件的状态从“激活”变为“未激活”的时候触发该事件,Destroy当组件被销毁时触发该事件 |
Enter | 当鼠标指针进入组件的时候触发该事件,注意:不是用户按下回车键(回车键是Return |
Expose | 当窗口或组件的某部分不再被覆盖的时候触发该事件 |
FocusIn | 当组件获得焦点的时候触发该事件,用户可以用Tab键将焦点转移到该组件上(需要该组件的takefocus选项为True),你也可以调用focus_set()方法使该组件获得焦点 |
FocusOut | 当组件失去焦点的时候触发该事件 |
KeyPress | 当用户按下键盘按键的时候触发该事件,detail可以指定具体的按键,例如 |
KeyRelease | 当用户释放键盘按键的时候触发该事件 |
Leave | 当鼠标指针离开组件的时候触发该事件 |
Map | 当组件被映射的时候触发该事件,意思是在应用程序中显示该组件的时候,例如调用get()方法 |
Motion | 当鼠标在组件内移动的时候触发该事件 |
MouseWheel | 当鼠标滚轮滚动的时候触发该事件,目前该事件仅支持Windows和Mac系统 |
Unmap | 当组件被取消映射的时候触发该事件,意思是在应用程序中不再显示该组件的时候,例如调用grid_remove()方法 |
Visibility | 当应用程序至少有一部分在屏幕中是可见的时候触发该事件 |
在事件序列中,modifier部分的内容可以是以下这些:
MODIFIER | 描述 |
---|---|
Alt | 当按下Alt按键的时候 |
Any | 表示任何类型的按键被按下的时候,例如 |
Control | 当按下Ctrl按键的时候 |
Double | 当后续两个事件被连续触发的时候,例如 |
Lock | 当打开大写字母锁定键(CapsLock)的时候 |
Shift | 当按下Shift按键的时候 |
Triple | 跟Double类似,当后续三个事件被连续触发的时候 |
当Tkinter回调自定义函数的时候,就会带着Event对象(作为参数)去调用,Event对象有如下属性可以使用:
属性 | 描述 |
---|---|
widget | 产生该事件的组件 |
x, y | 当前的鼠标的位置坐标(相对于窗口左上角,单位为像素) |
x_root, y_root | 当前的鼠标的位置坐标(相对于屏幕左上角,单位为像素) |
char | 按键对应的字符(键盘事件专属,不会显示Control,Shift等键) |
keysym | 按键名,见下方Key names(键盘事件专属) |
keycode | 按键码,见下方Key names(键盘事件专属) |
num | 按钮数字(鼠标事件专属) |
width, height | 组件的新尺寸(Configure事件专属) |
type | 该事件类型 |
打开PyCharm创建工程“tkinter_digital_watch”,选择在Anaconda中创建好的虚拟环境。
创建python文件“实验9.2_Tkinter实现桌面数字时钟”。
import tkinter
import threading
import datetime
import time
app = tkinter.Tk()
app.overrideredirect(True) # 不显示标题栏
app.attributes('-alpha', 0.9) # 半透明
app.attributes('-topmost', 1) # 总是在顶端
app.geometry('150x25+100+100') # 初始大小与位置
labelDateTime = tkinter.Label(app)
labelDateTime.pack(fill=tkinter.BOTH, expand=tkinter.YES)
labelDateTime.configure(bg='gray')
X = tkinter.IntVar(value=0) # 记录鼠标左键按下的位置
Y = tkinter.IntVar(value=0)
canMove = tkinter.IntVar(value=0) # 窗口是否可拖动
still = tkinter.IntVar(value=1) # 是否仍在运行
实验效果如下:
本实验主要介绍tkinter组件的使用方法和事件类型,事件的描述如下:
type部分的内容是必须的,描述事件类型
modifier是可选的,它通常用于描述组合键
detail是可选的,它通常用于描述具体的按键
源码下载链接