基于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> = <Button-1> = <ButtonPress-1>鼠标左键单击
<2> = <Button-2> = <ButtonPress-2>鼠标中键单击
<3> = <Button-3> = <ButtonPress-3>鼠标右键单击
<B1-Motion>鼠标左键拖动
<B2-Motion>鼠标中键拖动
<B3-Motion>鼠标右键拖动
<ButtonRelease-1>鼠标左键释放
<ButtonRelease-2>鼠标中键释放
<ButtonRelease-3>鼠标右键释放
<Double-Button-1>鼠标左键双击
<Double-Button-2>鼠标中键双击
<Double-Button-3>鼠标右键双击
<Motion>鼠标在某个按键被按下时的移动事件
<Enter>鼠标指针进入控件
<Leave>鼠标指针离开控件

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

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

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

<modifier-type-detail>

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

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

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

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

事件序列<Button-1>:用户点击鼠标左键

事件序列<KeyPress-H>:用户点击H按键

事件序列<Control-Shift-KeyPress-H>:用户同时点击Ctrl + Shift +H

type如下:

TYPE描述
Active当组件的状态从“未激活”变为“激活”的时候触发该事件
Button当用户点击鼠标按键的时候触发该事件,detail部分指定是具体用哪个键:<Button-1>鼠标左键,<Button-2>鼠标中键(滚轮点击),<Button-3>鼠标右键,<Button-4>滚轮上滚(Linux),<Button-5>滚轮下滚(Linux)
ButtonRelease当用户释放鼠标按键的时候触发该事件,在大多数情况下,比Button要更好使用,因为如果当用户不小心按下鼠标键,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件
Configure当组件的尺寸改变的时候触发该事件(窗口管理器触发的重绘事件,当你调整组件的尺寸或者移动应用程序,组件会和窗口一样被重绘)
Deactivate当组件的状态从“激活”变为“未激活”的时候触发该事件,Destroy当组件被销毁时触发该事件
Enter当鼠标指针进入组件的时候触发该事件,注意:不是用户按下回车键(回车键是Return<Key-Return>)
Expose当窗口或组件的某部分不再被覆盖的时候触发该事件
FocusIn当组件获得焦点的时候触发该事件,用户可以用Tab键将焦点转移到该组件上(需要该组件的takefocus选项为True),你也可以调用focus_set()方法使该组件获得焦点
FocusOut当组件失去焦点的时候触发该事件
KeyPress当用户按下键盘按键的时候触发该事件,detail可以指定具体的按键,例如<KeyPress-H>表示当大写字母H被按下的时候触发该事件。KeyPress可以缩写为Key
KeyRelease当用户释放键盘按键的时候触发该事件
Leave当鼠标指针离开组件的时候触发该事件
Map当组件被映射的时候触发该事件,意思是在应用程序中显示该组件的时候,例如调用get()方法
Motion当鼠标在组件内移动的时候触发该事件
MouseWheel当鼠标滚轮滚动的时候触发该事件,目前该事件仅支持Windows和Mac系统
Unmap当组件被取消映射的时候触发该事件,意思是在应用程序中不再显示该组件的时候,例如调用grid_remove()方法
Visibility当应用程序至少有一部分在屏幕中是可见的时候触发该事件

在事件序列中,modifier部分的内容可以是以下这些:

MODIFIER描述
Alt当按下Alt按键的时候
Any表示任何类型的按键被按下的时候,例如<Any-keyPress>表示当用户按下任何按键时触发事件
Control当按下Ctrl按键的时候
Double当后续两个事件被连续触发的时候,例如<Double-Button-1>表示当用户双击鼠标左键时触发事件
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程序运行流程如下:
请添加图片描述

5.1 创建工程目录和文件

打开PyCharm创建工程“tkinter_digital_watch”,选择在Anaconda中创建好的虚拟环境。
请添加图片描述

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

    <modifier-type-detail> 其中

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

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

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

源码下载链接

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python程序,使用Tkinter实现了一个基本的电子时钟。 ```python import tkinter as tk import time class Clock: def __init__(self, master): self.master = master self.master.title("电子时钟") self.master.geometry("250x100") self.clock_label = tk.Label(self.master, font=('times', 20, 'bold'), bg='white') self.clock_label.pack(fill=tk.BOTH, expand=1) self.update_clock() def update_clock(self): current_time = time.strftime('%H:%M:%S') self.clock_label.config(text=current_time) self.master.after(1000, self.update_clock) if __name__ == '__main__': root = tk.Tk() clock = Clock(root) root.mainloop() ``` 这个程序使用了Tkinter库来创建一个窗口和文本标签,用于显示当前时间。在构造函数中,我们创建了一个标签并设置了字体、背景颜色和文本。我们还调用了`update_clock()`函数,该函数使用`after()`方法来定期更新时钟。`after()`方法使用毫秒为单位的时间间隔和回调函数,以便在指定的时间间隔后调用回调函数。 在`update_clock()`函数中,我们使用Python内置的`time`模块来获取当前时间,并将其格式化为小时、分钟和秒的字符串。然后,我们将这个字符串设置为标签的文本,并使用`after()`方法来定期更新时钟。 最后,我们创建了一个`Tk`对象,并将其传递给`Clock`类的构造函数,然后启动了主事件循环。 这个程序只是一个最基本的电子时钟,但你可以根据需要对其进行修改和扩展,以满足你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值