桌面美化 Python tkinter倒计时工具

article/2025/8/23 3:23:29

桌面美化 Python tkinter倒计时工具

  • 效果
  • 一、壁纸设计
  • 二、倒计时小工具实现
    • 1.引入库
    • 2.倒计时函数
    • 3.绘制UI
      • 载入数据以及创建窗口
      • 创建Label控件
      • 控件布局
      • 绘制分割线
      • 绘制子窗口,用于修改倒计时目标
      • 其它设置
  • 完整代码
  • 打包并开机自启动
    • 打包成EXE
    • 开机自启动


效果

使用tkiner编写倒计时工具并放在桌面上,配合ps制作的壁纸,实现桌面美化
效果如下:

效果预览


一、壁纸设计

根据桌面文件布局风格、个人喜好、可以自行搜集或设计

我这里是用 PS 制作的壁纸,这里需要配合桌面的布局风格来制作,我主要就是按照布局绘制了底色,然后发现上边有点空,加了句话,这里使用的壁纸如下:在这里插入图片描述


二、倒计时小工具实现

设计啥的咱也不是专业的咱也不懂也不好说,直接说软件咋做的吧
初心就是tkinter的试水,之前用pyqt5做过一些东西,但是打包后70多Mb,这次想试试tkiner
(tkinter是真的轻便,也是真的不个性)

废话不多说,开撸!

1.引入库

因为需要不断刷新我们的倒计时,而tkinter的线程又是阻塞的,所以这里使用多线程

import tkinter as tk
from threading import Thread
import time

2.倒计时函数

主要就是根据时间截之差,计算相差的天数、以及余下的小时数、分钟数:

def get_time(handle):while True:s = handle.endtime - int(time.time())days = int(s / 86400)hours = int((s % 86400) / 3600)mins = int((s % 3600) / 60)handle.LabelDays.config(text=f'{days} 天')handle.LabelHours.config(text=f'{hours} 时')handle.LabelMins.config(text=f'{mins} 分')handle.LabelS.config(text=f'共计 {format(s,",")} 秒')time.sleep(1)

handle 是后边绘制UI时创建的类在调用此函数时传入的self(可以理解为继承???)
int() 用于取整(直接舍弃小数部分)
% 用于取余数
config 用于修改控件

3.绘制UI

载入数据以及创建窗口

首先,创建类,载入我们的倒计时数据,然后创建我们的窗口
class APP():def __init__(self):with open('config','r',encoding='utf8') as f:self.Target = f.readline().strip()self.endtime=eval(f.readline().strip())self.window = tk.Tk()# 设置窗口大小以及位置self.window.geometry('405x270+1128+290')

这里的 config 文件,是我存放倒计时目标以及时间截的地方
config内容:

开学
1613577600

self.window.geometry(‘405x270+1128+290’) 是指窗口宽为405,高为270,距离屏幕左边为1128,距离屏幕上边为290
这里数值的大小是我自己尝试出来的


创建Label控件

    def set_text(self):self.LabelTitle = tk.Label(self.window, text=f'距离 {self.Target} 还有', bg='#f9aea8',fg='white', font=('方正青铜体简体', 17))self.LabelDays = tk.Label(self.window, text='00 天', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelHours = tk.Label(self.window, text='00 时', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelMins = tk.Label(self.window, text='00 分', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelS = tk.Label(self.window, text='共计 000,000 秒', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))

这里用到的字体为 方正青铜体简体 ,可以改为自己电脑上的自己喜欢的字体。
非常烦的一件事就是tkinter的控件带背景颜色且不能透明,这也是为何我最终选择了纯色背景——方便

如果想用图片做背景,还想控件背景透明的话,可以参考 这篇文章,作者通过切割窗口背景图片然后将切割后的图片作为控件背景的方法,另辟蹊径的解决了这个问题,Nice!


控件布局

    def set_layout(self):tk.Label(self.window, bg='#f9aea8').pack(expand='yes')  # 仅用来占地方,避免其它控件位置过于靠上self.LabelTitle.pack(expand='yes')self.LabelDays.pack(expand='yes')self.LabelHours.pack(expand='yes')self.LabelMins.pack(expand='yes')self.LabelS.pack(expand='yes')tk.Label(self.window, bg='#f9aea8').pack()  # 仅用来占地方,避免其它控件位置过于靠下

这里采用的pack的方法来布局的,关于pack,可以参考这里。

绘制分割线

这里还画了两条白色的分割线用于美化

    def set_Line(self):self.CanvasBg = tk.Canvas(self.window, bg='#f9aea8', width=405, height=270)self.CanvasBg.place(x=0, y=0)self.CanvasBg.create_line(0, 73, 405, 73, fill='white')self.CanvasBg.create_line(0, 200, 405, 200, fill='white')

self.CanvasBg.create_line(0, 73, 405, 73, fill=‘white’)
是指画一条从(0,73)到(405,73)的白色线段

注意:需要在Canvas控件上进行绘制。

绘制子窗口,用于修改倒计时目标

    def updata_window(self,event):  # 绘制子窗口self.UpdataWindow = tk.Toplevel()self.UpdataWindow['bg'] = '#f6ccb4'self.UpdataWindow.title('修  改')self.UpdataWindow.geometry('240x140')self.EntryTarget = tk.Entry(self.UpdataWindow)  # 目标输入框self.EntryEndtime = tk.Entry(self.UpdataWindow)  # 时间截输入框tk.Label(self.UpdataWindow,bg='#f6ccb4', text='目  标').grid(row=1, column=1,pady=10,padx=5)self.EntryTarget.grid(row=1,column=2)tk.Label(self.UpdataWindow,bg='#f6ccb4', text='时间截').grid(row=2,column=1,pady=10,padx=5)self.EntryEndtime.grid(row=2,column=2)# 修改按钮tk.Button(self.UpdataWindow, bg='#f9aea8', fg='white',width='19', text='修改',command=self.updata).grid(row=3,column=2)def updata(self):  # 用于将修改更新到父窗口if self.EntryEndtime.get():self.Target = self.EntryTarget.get()self.endtime = eval(self.EntryEndtime.get())  # 获取时间截数值self.LabelTitle.config(text=f'距离 {self.Target} 还有')self.UpdataWindow.destroy()  # 销毁子窗口with open('config', 'w', encoding='utf8') as f:  # 保存到本地f.write(f'{self.Target}\n{self.endtime}')

这里采用的是的是grid的布局方式,简单来说,按照表格的方式布局,row是第几行,column是第几列,还有其它参数这里没用到,如:
padx 是单元格左右间距
pady 是单元格上下间距
ipadx是单元格内部元素与单元格左右的间距
ipady是单元格内部元素与单元格上下的间距

其它设置

    def set_others(self):self.window.resizable(0, 0)  # 固定窗口大小,不可调整self.window.overrideredirect(True)  # 去除窗口标题栏self.LabelTitle.bind("<Button-1>", self.updata_window)  # 绑定鼠标左击事件,用于修改目标Thread(target=get_time,args=(self,)).start()  # 多线程启动刷新时间函数

最后,在init里该调用调用,在外面该初始化初始化,完整代码如下

完整代码

import tkinter as tk
from threading import Thread
import timedef get_time(handle):while True:s = handle.endtime - int(time.time())days = int(s / 86400)hours = int((s % 86400) / 3600)mins = int((s % 3600) / 60)handle.LabelDays.config(text=f'{days} 天')handle.LabelHours.config(text=f'{hours} 时')handle.LabelMins.config(text=f'{mins} 分')handle.LabelS.config(text=f'共计 {format(s,",")} 秒')time.sleep(1)class APP():def __init__(self):with open('config','r',encoding='utf8') as f:self.Target = f.readline().strip()self.endtime=eval(f.readline().strip())self.window = tk.Tk()self.window.geometry('405x270+1128+290')self.set_Line()self.set_text()self.set_layout()self.set_others()def set_Line(self):self.CanvasBg = tk.Canvas(self.window, bg='#f9aea8', width=405, height=270)self.CanvasBg.place(x=0, y=0)self.CanvasBg.create_line(0, 73, 405, 73, fill='white')self.CanvasBg.create_line(0, 200, 405, 200, fill='white')def set_text(self):self.LabelTitle = tk.Label(self.window, text=f'距离 {self.Target} 还有', bg='#f9aea8',fg='white', font=('方正青铜体简体', 17))self.LabelDays = tk.Label(self.window, text='00 天', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelHours = tk.Label(self.window, text='00 时', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelMins = tk.Label(self.window, text='00 分', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))self.LabelS = tk.Label(self.window, text='共计 000,000 秒', bg='#f9aea8', fg='white', font=('方正青铜体简体', 17))def set_layout(self):tk.Label(self.window, bg='#f9aea8').pack(expand='yes')self.LabelTitle.pack(expand='yes')self.LabelDays.pack(expand='yes')self.LabelHours.pack(expand='yes')self.LabelMins.pack(expand='yes')self.LabelS.pack(expand='yes')tk.Label(self.window, bg='#f9aea8').pack()def set_others(self):self.window.resizable(0, 0)self.window.overrideredirect(True)self.LabelTitle.bind("<Button-1>", self.updata_window)Thread(target=get_time,args=(self,)).start()def updata_window(self,event):self.UpdataWindow = tk.Toplevel()self.UpdataWindow['bg'] = '#f6ccb4'self.UpdataWindow.title('修  改')self.UpdataWindow.geometry('240x140')self.EntryTarget = tk.Entry(self.UpdataWindow)self.EntryEndtime = tk.Entry(self.UpdataWindow)tk.Label(self.UpdataWindow,bg='#f6ccb4', text='目  标').grid(row=1, column=1,pady=10,padx=5)self.EntryTarget.grid(row=1,column=2)tk.Label(self.UpdataWindow,bg='#f6ccb4', text='时间截').grid(row=2,column=1,pady=10,padx=5)self.EntryEndtime.grid(row=2,column=2)tk.Button(self.UpdataWindow, bg='#f9aea8', fg='white',width='19', text='修改',command=self.updata).grid(row=3,column=2)def updata(self):if self.EntryEndtime.get():self.Target = self.EntryTarget.get()self.endtime = eval(self.EntryEndtime.get())self.LabelTitle.config(text=f'距离 {self.Target} 还有')self.UpdataWindow.destroy()with open('config', 'w', encoding='utf8') as f:f.write(f'{self.Target}\n{self.endtime}')if __name__ == '__main__':myapp = APP()myapp.window.mainloop()

打包并开机自启动

打包成EXE

pyinstaller -D de_desktop.py -p venv\Lib\site-packages --noconsole

这里的 -D de_desktop.py 是指文件名是 de_desktop.py
-p venv\Lib\site-packages 是指库函数的目录在这里(我这里用的是相对路径)
–noconsole 是指不需要命令窗口(默认不加这句的话,启动程序后会有一个cmd似的窗口)

开机自启动

直接将打包好的EXE的快捷方式复制到开机启动项的文件夹内

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

注意:win+d快捷键返回桌面时,程序界面会被隐藏,按alt+f4可以调出;其他方式返回桌面时没问题。
如果你有隐藏标题栏又同时不隐藏状态栏的方法,欢迎告知,在线求。


http://chatgpt.dhexx.cn/article/jMbfAWVC.shtml

相关文章

Python 内置模块tkinter —— 秒表计时器

# 秒表计时器""" 思考&#xff1a;1、怎么创建一个最简单的窗口&#xff1f;2、怎么保持窗口一直运行&#xff1f;3、不用方法mainloop&#xff08;&#xff09;怎么实现窗口一直运行&#xff1f;4、请问窗口的宽度*高度默认值为多少个像素点&#xff1f;5、利用…

Python-桌面计时器程序设计

该程序是我个人去年学习之初练习设计&#xff0c;程序功能并没有很完善和简便。设计想法是为了能够有一个可观性高的时间报时器&#xff0c;程序设计耗时2天&#xff0c;程序分成三个部分&#xff1a;主窗体、设置窗口、运行程序。 效果展示图 功能 正/反计时功能 到时提醒/关…

专利的写作

关于专利&#xff0c;由于是研究生阶段&#xff0c;发表专利有和学校合作的机构&#xff0c;支付2000给代理人&#xff0c;只需要将想法写明白&#xff0c;和代理人沟通好&#xff0c;受理那必然是有手就行。关于研究点&#xff0c;我已经推导完毕两个月了&#xff0c;因为要做…

手把手教你如何写专利申请书

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。众所周知&#xff0c;专利是最重要的一种知识产权&#xff0c;专利制度有利于保护技术创新&#xff0c;保护专利权人的利益&#xff0c;促进社会发展&#xff0c;把我国建设成一个科技强国&#xff0c;创新大国。对于企业而…

实用新型专利撰写

文件下载 表格可在国家知识产权网下载 直达地址 说明书摘要 1、文件写法 本实用新型公开了&#xff0c;其特征在于&#xff1a;______。主要组成部分&#xff1b;主要组成部分又由哪些部分组成&#xff1b;并说明位置关系&#xff08;位于xxx一侧&#xff0c;位于顶角处…&…

专利写法与相关知识

原文&#xff1a;https://www.cnblogs.com/bozhicheng/p/7204693.html by 薄小成 https://www.jianshu.com/p/4f48add262c1 这也是一个比较好的链接 从你幸运的进入大棚124实验室那刻起&#xff0c;发论文和写专利将贯穿你整个研究生生涯。相比于发论文&#xff0c;写专利这项工…

【数据库】简介

目录 0. 文章脉络 1. 信息和数据 2. 数据处理 3. 数据库管理数据的特点 4. 数据库系统 5. 数据库管理系统 6. 数据库的三级模式 0. 文章脉络 1. 信息和数据 信息是生活中能获取的一切事物的相关描述。用书上的话来说&#xff0c;信息就是一切新的&#xff0c;有用的事实…

数据库介绍之MySQL

文章目录 数据库优点分类常见数据库RDBMSSQL定义分类sql 脚本sql 语句规范 CRUD MySQL启动连接修改密码忘记密码三层结构结构表 三范式关系数据库设计三范式经典设计多对多一对多一对一 数据库 用来存储和管理数据的仓库 优点 可存储大量数据&#xff0c;方便检索保持数据的…

Cassandra数据库介绍

Cassandra 数据库&#xff0c;值得介绍的技术细节其实挺多的。因为它很多实现思路和关系型数据库或者其他的 NoSQL 数据库&#xff0c;是有一些不同的。这种不同是在数据库设计实现思路上也是根源上的。所以衍生开来的诸多特点&#xff0c;在介绍起来就不太容易和其他数据库去类…

MySQL入门之数据库介绍及MySQL介绍

------------------------------------------------------------------------------------------------------------- 教程大纲: http://blog.csdn.net/qq78442761/article/details/76018310 ------------------------------------------------------------------------------…

数据库概述与常见数据库介绍

前言 本栏目会从数据库概念开始到数据库的SQL优化持续更新&#xff08;站在Java开发的角度&#xff0c;不站在数据库管理员&#xff08;DBA&#xff09;角度&#xff09;&#xff0c;本篇是第一篇《数据库常用概念》以开启我的数据库之旅&#xff0c;主要是讲述MySQL 8.0数据库…

ORACLE数据库介绍

什么是 ORACLE? ORACLE数据库系统是美国ORACLE公(甲骨文)提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE通常应用于大型系统的数据库产品。 ORACLE数据库是目前世界上使用最为广泛的数…

一幅长文细学GaussDB(一)——数据库介绍

文章目录 1 数据库介绍1.1 数据库技术1.2 数据库技术发展史数据库技术产生和发展数据库三个阶段比较数据库系统优势层次模型网状模型关系模型关系数据库产品历史结构化查询语言SQL面向对象数据模型&#xff08;OO模型&#xff09;数据管理技术的新挑战NoSQL技术特点和类型主要N…

MIMIC-IV数据库介绍与使用说明

MIMIC-IV 一些基本逻辑各模块和table介绍TablesCoreHospICUEDCXRNote 官网及数据库下载网址2022.6.12 更新 在word中更加详细的列出了各table中table所代表的含义以及我在使用中所遇到的问题&#xff0c;可在资源页面进行下载。 一些基本逻辑 病人定义&#xff1a; subject_…

第一章 数据库介绍

第一章 数据库介绍 文章目录 第一章 数据库介绍一、 数据库技术&#xff1a;1、数据(Data)2、数据库(Database&#xff0c;DB)3、数据库管理系统(DBMS)4、数据库系统(Database System&#xff0c;DBS) 二、数据库发展史&#xff1a;1、三个阶段&#xff1a;2、数据库系统优势: …

一、数据库介绍

1.1数据库概述 &#xff08;1&#xff09;什么是数据库(DataBase) 简言之&#xff0c;数据库就是储存数据的仓库&#xff0c;其本质为一个文件系统(二进制存储) &#xff08;2&#xff09;什么是数据库管理系统(DataBase Management System-DBMS) DBMS是一个软件&#x…

数据库概论 - 数据库的介绍

数据库相关基础概论 大家好&#xff0c;这次给大家带来的是我的新的专栏&#xff1a;数据库&#xff0c;数据库相对来说难度不是那么高&#xff0c;大家只要勤加练习、熟记语法&#xff0c;我相信学好数据库不是什么问题&#xff0c;博主会从0剖析&#xff0c;逐步讲解数据库的…

【数据库】SRA数据库介绍及数据下载

【数据库】SRA数据库介绍及数据下载 生信技术 2021-10-06 11:00 以下文章来源于生信Alpha &#xff0c;作者BioinfoPenn 生信Alpha. 生物信息、生物统计、Linux系统、shell、R、Python等日常学习记录分享&#xff5e;欢迎交流指正&#xff5e; 【数据库】SRA数据库介绍及数…

【MySQL】数据库介绍以及MySQL数据库

目录 数据库介绍 数据库概述 数据表 MySql数据库 MySql安装 登录MySQL数据库 ​​​​​​​SQLyog&#xff08;MySQL图形化开发工具&#xff09; 数据库介绍 数据库概述 什么是数据库(DB:DataBase) 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&…

SQL——Mysql数据库介绍

声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 MySQL&#xff1a; 介绍&#xff1a; 什么是数据库&#xff1f;就是一个软件&#xff…