基于Tkinter实现桌面电子时钟(附源码)

基于Tkinter实现桌面电子时钟

一、实验内容

使用tkinter实现桌面电子时钟,时钟显示日期(年月日)和时间(时分秒),时钟窗口置顶,并且可以用鼠标左键拖动位置,点击鼠标右键结束程序。实验效果如下:
请添加图片描述

二、实验目标

  • 熟练掌握tkinter组件的操作

  • 熟练掌握tkinter事件触发原理和实现方式

三、实验环境

  • 操作系统:Ubuntu16.04
  • 工具软件:PyCharm 2020.1.5 Anaconda3 2020.07
  • 硬件环境:无特殊要求
  • 核心库:python 3.6.13

四、实验原理

4.1 Tkinter简介

Tkinter(也叫 Tk 接口)是 Tk 图形用户界面工具包标准 的 Python 接口。Tk 是一个轻量级的跨平台图形用户界面 (GUI)开发工具。 Tk 和 Tkinter 可以运行在大多数 的 Unix 平台、Windows、和 Macintosh 系统。

Tkinter 由一定数量的模块组成。 Tkinter 位于一个名为 _tki nter(较早的版本名为 tki nter)的二进制模块中 。 Tkinter 包含了对 Tk 的低级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或 DLL), 但是在一些情况下它也被 Python 解释器静态链接。

4.2 Tkinter事件原理

一个 Tkinter 应用程序大部分时间是花在事件循环当中的,也就是通过 mainloop() 进入的事件循环。

事件可以有各种来源:用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户简介引起的),Tkinter 给我们提供了一个强大的机制去管理这些事件,去定义这些事件的操作。对每一个组件来说,可以通过 bind() 的方法来将自己定义的函数或方法绑定到具体的事件上。

widget.bind(event, handler)

当被触发的事件满足该组件绑定的事件的时候,Tkinter 就会带着事件对象(Event、事件本身的描述)去调用自定义的 handler() 方法。

Tkinter鼠标事件类型:

事件类型代码 事件类型
<1> = = 鼠标左键单击
<2> = = 鼠标中键单击
<3> = = 鼠标右键单击
鼠标左键拖动
鼠标中键拖动
鼠标右键拖动
鼠标左键释放
鼠标中键释放
鼠标右键释放
鼠标左键双击
鼠标中键双击
鼠标右键双击
鼠标在某个按键被按下时的移动事件
鼠标指针进入控件
鼠标指针离开控件

以上只展示了鼠标事件和事件类型代码,除了鼠标事件之外,还有键盘事件、窗体事件等。同学可以自行查阅资料了解。

Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需要使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(若果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)。

事件序列使用以下语法描述:


事件序列是包含在尖括号(<…>)中的

type部分的内容是必须的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击

modifier部分的内容是可选的,它通常用于描述组合键,例如Ctrl + c(),Shift + 鼠标左键点击(

detail部分的内容是可选的,它通常用于描述具体的按键,例如Button-1表示的是鼠标左键,

事件序列:用户点击鼠标左键

事件序列:用户点击H按键

事件序列:用户同时点击Ctrl + Shift +H

type如下:

TYPE 描述
Active 当组件的状态从“未激活”变为“激活”的时候触发该事件
Button 当用户点击鼠标按键的时候触发该事件,detail部分指定是具体用哪个键:鼠标左键,鼠标中键(滚轮点击),鼠标右键,滚轮上滚(Linux),滚轮下滚(Linux)
ButtonRelease 当用户释放鼠标按键的时候触发该事件,在大多数情况下,比Button要更好使用,因为如果当用户不小心按下鼠标键,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件
Configure 当组件的尺寸改变的时候触发该事件(窗口管理器触发的重绘事件,当你调整组件的尺寸或者移动应用程序,组件会和窗口一样被重绘)
Deactivate 当组件的状态从“激活”变为“未激活”的时候触发该事件,Destroy当组件被销毁时触发该事件
Enter 当鼠标指针进入组件的时候触发该事件,注意:不是用户按下回车键(回车键是Return
Expose 当窗口或组件的某部分不再被覆盖的时候触发该事件
FocusIn 当组件获得焦点的时候触发该事件,用户可以用Tab键将焦点转移到该组件上(需要该组件的takefocus选项为True),你也可以调用focus_set()方法使该组件获得焦点
FocusOut 当组件失去焦点的时候触发该事件
KeyPress 当用户按下键盘按键的时候触发该事件,detail可以指定具体的按键,例如表示当大写字母H被按下的时候触发该事件。KeyPress可以缩写为Key
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 该事件类型

五、实验步骤

Tkinter程序运行流程如下:
基于Tkinter实现桌面电子时钟(附源码)_第1张图片

5.1 创建工程目录和文件

打开PyCharm创建工程“tkinter_digital_watch”,选择在Anaconda中创建好的虚拟环境。
基于Tkinter实现桌面电子时钟(附源码)_第2张图片

创建python文件“实验9.2_Tkinter实现桌面数字时钟”。

5.2 部分源码截图

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组件的使用方法和事件类型,事件的描述如下:

    其中

    1. type部分的内容是必须的,描述事件类型

    2. modifier是可选的,它通常用于描述组合键

    3. detail是可选的,它通常用于描述具体的按键

源码下载链接

你可能感兴趣的:(python,开发语言)