【项目分享】用 Python 写一个桌面倒计日程序!

ops/2024/12/22 18:33:10/

事情是这样的,我们班主任想委托我做一个程序,能显示还有几天考试。我立即理解了这个意思,接下了这个项目。

话不多说,来看看这个项目吧——

项目简介

仓库地址:https://gitee.com/yaoqx/desktop-countdown-day

这是 gitee 上这个项目的地址,项目的详细介绍以及使用说明都在上面,欢迎来参观!😝

语言:Python

作者:我,还有我的同学 @a瓦达啃瓜瓜

实现思路

参考这张思维导图,应该能明白大概思路了吧!

完整代码

python">import tkinter as tk
from tkinter import messagebox as msg
import datetime as dt
from PIL import Image, ImageTk
import sys, osname, date = "暂无", ""
size = 50# 打包exe后的文件路径
def resource_path(relative_path):try:base_path = sys._MEIPASSexcept Exception:base_path = os.path.abspath(".")return os.path.join(base_path, relative_path)# 读取文件中日期
with open(resource_path("data.txt"), "r", encoding="utf-8") as file:data = file.read()data = data.split()# 处理if len(data) != 0:name = data[0]date = data[1]# 窗口初始化
win = tk.Tk()
win.attributes("-transparentcolor", "#F0F0F0") # 透明 
win.overrideredirect(True) # 无边框
win.geometry("350x200+1500+30") # 位置:屏幕右上角# 背景图片
def get_img(filename):pic = Image.open(filename).resize((345, 200))return ImageTk.PhotoImage(pic)bg = tk.Canvas(win, width=350, height=200)
img = get_img(resource_path("bg.png"))
bg.create_image(175, 100, image=img)
bg.place(x=175, y=100, anchor="center")day_frm = None
# 更新内容
def update():global day_frm, date, nameif day_frm != None:day_frm.destroy()day_frm = tk.Frame(win, bg="lightyellow")day_frm.pack(anchor="center", fill="both", padx=15, pady=10)# 有日期if not date == "":# 计算剩余天数now = dt.datetime.today()tar = dt.datetime.strptime(date, "%Y.%m.%d")ans = (tar - now).days + 1if ans < 0:ans = "已过"elif ans == 0:ans = "今天!"else:ans = str(ans)if ans == "已过" or ans == "今天!":size = 40elif len(ans) <= 2:size = 60elif len(ans) <= 3:size = 50else:size = 40tk.Label(day_frm, text=ans, bg="lightyellow", font=("黑体", size), justify="right").pack(side="right", padx=15)tk.Label(day_frm, text='\n'+name+'\n\n\n'+date, bg="lightyellow", font=("黑体", 18), justify="left").pack(side="left", padx=20, pady=5)update()# 编辑
def edit():global name, date, day_frmedit_win = tk.Frame(win, bg="lightyellow")edit_win.place(anchor="center", x=175, y=100, width=320, height=170)day_frm.destroy()# 取消def cancel():edit_win.destroy()update()# 文字tk.Label(edit_win, text="名称:", bg="lightyellow", font=("微软雅黑", 12)).grid(row=0, column=0, padx=15, pady=15)tk.Label(edit_win, text="日期:", bg="lightyellow", font=("微软雅黑", 12)).grid(row=1, column=0, padx=12, pady=8)# 输入框entry1 = tk.Entry(edit_win, width="22", font=("等线", 13), highlightcolor="blue")entry1.grid(row=0, column=1, columnspan=2, padx=15, pady=15)entry2 = tk.Entry(edit_win, width="22", font=("等线", 13))entry2.grid(row=1, column=1, columnspan=2, padx=12, pady=8)# 输入提示tk.Label(edit_win, text="如:2024.10.1", bg="lightyellow", fg="darkgrey", font=("微软雅黑", 10)).grid(row=2, column=1)# 确定def ok():global name, datename = entry1.get()date = entry2.get()# 名称为空if name == "":msg.showerror(title="错误", message="名称不能为空!")return# 判断日期是否合法nums = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]tmp = date.split('.')error = Falseif len(tmp) != 3:error = Truefor j, i in enumerate(tmp):# 是否数字if not i.isdigit():error = Truebreaki = int(i)if j == 0: # 年份if i < 2000:error = Trueelif j == 1: # 月份if i <= 0 or i > 12:error = Trueelif j == 2: # 天if (int(tmp[0]) % 4 == 0 and int(tmp[0]) % 100 != 0) or int(tmp[0]) % 400 == 0:nums[2] += 1if i <= 0 or i > nums[int(tmp[1])]:error = Trueif (int(tmp[0]) % 4 == 0 and int(tmp[0]) % 100 != 0) or int(tmp[0]) % 400 == 0:nums[2] -= 1if error:msg.showerror(title="错误", message="请输入正确日期!")return# 更新文件with open(resource_path("data.txt"), "w", encoding="utf-8") as file:file.write(name + " " + date)edit_win.destroy()update()# 按钮tk.Button(edit_win, text="确定", bd=0, bg="lightyellow", activebackground="lightyellow", command=ok, font=("微软雅黑", 12), cursor="hand2", activeforeground="grey").grid(row=3, column=1, padx=10, pady=17)tk.Button(edit_win, text="取消", bd=0, bg="lightyellow", activebackground="lightyellow", command=cancel, font=("微软雅黑", 12), cursor="hand2", activeforeground="grey").grid(row=3, column=2, padx=10, pady=17)# 按钮
btn_frm = tk.Frame(win, bg="lightyellow")
btn_frm.pack(side="bottom", anchor="e", after=day_frm, padx=25, pady=10)# 编辑按钮
add_btn = tk.Button(btn_frm, text="编辑", font=("微软雅黑", 12), command=edit, bd=0, bg="lightyellow", activebackground="lightyellow", cursor="hand2", activeforeground="grey")
add_btn.pack(side="right", anchor="s")# 关闭按钮
def quit():win.destroy()
quit_btn = tk.Button(btn_frm, text="关闭", font=("微软雅黑", 12), command=quit, bd=0, bg="lightyellow", activebackground="lightyellow", cursor="hand2", activeforeground="grey")
quit_btn.pack(side="right", anchor="s")# 置顶按钮
def top():win.wm_attributes("-topmost", True)top_btn["command"] = no_toptop_btn["text"] = "取消置顶"
def no_top():win.wm_attributes("-topmost", False)top_btn["command"] = toptop_btn["text"] = "置顶"top_btn = tk.Button(btn_frm, text="置顶", font=("微软雅黑", 12), command=top, bd=0, bg="lightyellow", activebackground="lightyellow", cursor="hand2", activeforeground="grey")
top_btn.pack(side="right", anchor="s")win.mainloop()

不过有个问题,就是 auto-py-to-exe 库打包成单独的 exe 后会把附加文件放在 appdata 里的一个地方,如果要调用就需要管理员权限才能读取,有时候还会被杀毒软件误以为病毒并删掉文件,不知道有什么办法?

最后,如果有任何 bug 或建议,可以在这里评论或在 gitee 上反馈,如果想要出教程的话,可以评论或私信我,感谢支持!

如果觉得这个项目还不错的话,请点赞收藏,顺便在 gitee 上 star 一下,求求了!


http://www.ppmy.cn/ops/19090.html

相关文章

电脑安装双系统

在一台电脑上安装Linux和Windows的双系统可以让你在同一硬件上运行两种操作系统。以下是安装Linux和Windows双系统的一般步骤&#xff1a; 步骤1: 备份数据 在进行任何操作系统安装或重大更改之前&#xff0c;首先备份你的重要数据&#xff0c;以防万一出现问题。 步骤2: 准…

每天一个数据分析题(二百八十五)——四分位差

四分位差是一组数据的上四分位数与下四分位数之差&#xff0c;下面选项错误的是 A. 四分位差受极端值的影响 B. 四分位差是一个局部指标&#xff0c;衡量了处于50%数据的离散程度 C. 四分位差越大&#xff0c;说明处于中间50%数据越分散 D. 顺序数据适合用四分位差来度量离…

springboot+thymeleaf实现一个简单的监听在线人数功能

功能步骤&#xff1a; 1. 当用户访问登录页面时&#xff0c;Logincontroller的showLoginForm方法被调用&#xff0c;返回登录页面的视图名字。 2. 用户提交表单&#xff0c;调用LoginController的login方法。 3.login方法 4.登录验证通过&#xff0c;home方法会被调用&#xf…

实验7:路由冗余协议HSRP配置管理(课内实验以及解答)

实验目的及要求&#xff1a; 理解首跳冗余协议&#xff08;FHRP&#xff09;的工作原理&#xff0c;掌握热备份路由器协议 (HSRP)&#xff08;思科私有协议&#xff09;原理和配置。能够实现网络终端设备虚拟网关的配置和网络故障的灵活切换&#xff0c;完成相应网络的联通性测…

安装crossover游戏提示容量不足怎么办 如何把游戏放到外置硬盘里 Mac电脑清理磁盘空间不足

CrossOver作为一款允许用户在非原生操作系统上运行游戏和应用程序的软件&#xff0c;为不同平台的用户提供了极大的便利。然而&#xff0c;随着游戏文件大小的不断增加&#xff0c;内置硬盘的容量往往无法满足安装需求。幸运的是&#xff0c;通过一些简单的步骤&#xff0c;我们…

在线音乐播放网站项目测试(selenium+Junit5)

在做完在线音乐播放网站项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#…

Git Tag 打标签

参考地址&#xff1a;Git基础 - git tag 一文真正的搞懂git标签的使用-CSDN博客 创建标签 $ git tag -a 标签名称 -m 附注信息 or $ git tag -a 标签名称 提交版本号 -m 附注信息说明&#xff1a; -a : 理解为 annotated 的首字符&#xff0c;表示 附注标签 -m : 指定附注信息…

【sping】在logback-spring.xml 获取项目名称

在日志文件中我们想根据spring.application.name 创建出的文件夹。 也不想死在XML文件中。 application.yml spring:application:name: my-demo logback-spring.xml <springProperty name"application_name" scope"context" source"spring.app…