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

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

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

项目简介

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

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

语言:Python

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

实现思路

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

完整代码

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.mzph.cn/pingmian/3912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幻兽帕鲁中文怎么设置 游戏中文修改方法 《幻兽帕鲁》宠物指定配种显示英文解决方法 幻兽帕鲁Steam游戏解说合集 Mac玩Windows游戏

在广阔的世界中收集神奇的生物“帕鲁”&#xff0c;派他们进行战斗、建造、做农活&#xff0c;工业生产等&#xff0c;这是一款支持多人游戏模式的全新开放世界生存制作游戏。幻兽帕鲁支持多人在线捕捉“帕鲁”&#xff0c;展开丰富的冒险玩法&#xff1b;不同的关卡具有不同的…

Bellman Ford算法:解决负权边图的最短路径问题

Bellman Ford算法的介绍 在计算机科学的世界中&#xff0c;Bellman Ford算法是一种解决单源最短路径问题的算法&#xff0c;它可以处理有负权边的图。这个算法的名字来源于两位科学家Richard Bellman和Lester Randolph Ford&#xff0c;他们是这个算法的发明者。 这个算法的主…

AI图书推荐:2024年ChatGPT副业搞钱指南

本书《2024年ChatGPT副业搞钱指南》&#xff08;ChatGPT Side Hustles 2024&#xff09;由Alec Rowe撰写&#xff0c;旨在指导读者如何利用ChatGPT技术来提升被动收入、创造新的现金流&#xff0c;并在数字化时代保持领先。 本书是深入了解被动收入未来的综合指南。本书揭示了超…

【算法基础实验】图论-基于DFS的连通性检测

基于DFS的连通性检测 理论基础 在图论中&#xff0c;连通分量是无向图的一个重要概念&#xff0c;特别是在处理图的结构和解析图的组成时。连通分组件表示图中的一个子图&#xff0c;在这个子图中任意两个顶点都是连通的&#xff0c;即存在一条路径可以从一个顶点到达另一个顶…

Flutter应用下拉菜单设计DropdownButtonFormField控件介绍

文章目录 DropdownButtonFormField介绍使用方法重点代码说明属性解释 注意事项 DropdownButtonFormField介绍 Flutter 中的 DropdownButtonFormField 是一个用于在表单中选择下拉菜单的控件。它是 DropdownButton 和 TextFormField 的组合&#xff0c;允许用户从一组选项中选择…

井字棋游戏

1. 游戏创建 1.1导包 from tkinter import * import numpy as np import math import tkinter.messagebox 1.2 窗口内容 1.2.1创建一个窗口 root Tk() # 窗口名称 root.title("井字棋 from Sun") 1.2.2 创建一个框架&#xff0c;将其放置在窗口中 Frame1 F…

汽车底盘域的学习笔记

前言&#xff1a;底盘域分为传统车型底盘域和新能源车型底盘域&#xff08;新能源系统又可以分为纯电和混动车型&#xff0c;有时间可以再研究一下&#xff09; 1&#xff1a;传统车型底盘域 细分的话可以分为四个子系统 传动系统 行驶系统 转向系统 制动系统 1.1传动系…

什么样的内外网文档摆渡,可以实现安全高效传输?

内外网文档摆渡通常指的是在内网&#xff08;公司或组织的内部网络&#xff09;和外网&#xff08;如互联网&#xff09;之间安全地传输文件的过程。这个过程需要特别注意安全性&#xff0c;因为内网往往包含敏感数据&#xff0c;直接连接内网和外网可能会带来安全风险。因此会…

设计模式——终止模式之两阶段终止模式

文章目录 1. 错误思路2. 两阶段终止模式2.1 利用 isInterrupted2.2 利用停止标记interrupt-打断park Two Phase Termination 在一个线程 T1 中如何“优雅”终止线程 T2&#xff1f;这里的【优雅】指的是给 T2 一个料理后事的机会。 1. 错误思路 使用线程对象的 stop() 方法停…

GEM TSU Interface Details and IEEE 1588 Support

摘要&#xff1a;Xilinx ZNYQ ULTRASCALE MPSOC的GEM和1588的使用 对于FPGA来说&#xff0c;只需要勾选一些znyq的配置就行了&#xff0c;其余的都是软件的工作&#xff1b; 所有配置都勾选之后&#xff0c;最终会露出来的接口如下&#xff1a; GEM需要勾选的配置如下&#xf…

15.Blender Eevee和Cycles渲染引擎对比

初步介绍 Eevee是实时渲染的引擎&#xff0c;会省略一些解算方式&#xff0c;尤其对光线和阴影 Cycles会考虑这些因素&#xff0c;所以会对光线和阴影的表达更加真实&#xff0c;有一个实时光线追踪的功能 Cycles渲染完之后&#xff0c;每移动一次画面&#xff0c;都会重新渲染…

政安晨:【Keras机器学习示例演绎】(十九)—— 可视化网络学习内容

目录 简介 设置 建立特征提取模型 设置梯度上升过程 设置端到端滤波器可视化回路 可视化目标层中的前 64 个滤波器 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…

基于Rust的多线程 Web 服务器

构建多线程 Web 服务器 在 socket 上监听 TCP 连接解析少量的 HTTP 请求创建一个合适的 HTTP 响应使用线程池改进服务器的吞吐量优雅的停机和清理注意&#xff1a;并不是最佳实践 创建项目 ~/rust ➜ cargo new helloCreated binary (application) hello package~/rust ➜ma…

kaggle之皮肤癌数据的深度学习测试

kaggle之皮肤癌数据的深度学习测试 近期一直在肝深度学习 很久之前&#xff0c;曾经上手搞过一段时间的深度学习&#xff0c;似乎是做轮胎花纹的识别&#xff0c;当初用的是TensorFlow&#xff0c;CPU版本的&#xff0c;但已经很长时间都没弄过了 现在因为各种原因&#xff…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…

打包的意义 作用等前端概念集合 webpack基础配置等

基础网页是什么&#xff1f; 在学校最基础的三剑客 原生JS CSS H5就可以开发静态网页了 对于浏览器而言也能识别这些基础的文件和语法&#xff0c;真正的所见即所得&#xff0c;非常直接。 为什么要使用框架库&#xff1f; 对于常用的前端框架而言&#xff0c;无论是Vue Rea…

普通屏幕已过时?裸眼3D屏幕显示效果更胜一筹!

随着多媒体技术的迅猛进步&#xff0c;我们日常生活中的内容展现方式&#xff0c;已经经历了前所未有的变革。在这其中&#xff0c;裸眼3D屏幕的应用&#xff0c;无疑是最为引人注目的亮点&#xff0c;它相较于传统屏幕&#xff0c;在显示效果上展现出了鲜明的优势&#xff0c;…

RGB灯珠的控制-单片机通用模板

RGB灯珠的控制-单片机通用模板 一、RGB控制的原理二、RGB.c的实现三、RGB.h的实现四、color色彩空间变换以及控制渐变一、RGB控制的原理 ①通过IO发送脉冲识别0/1编码,组合24Bit的RGB数据,从而控制RGB;②每个RGB灯珠通过DIN、DOU进行级联起来;③通过HSV色彩转换成RGB从而控…

ArcGIS批量寻找图层要素中的空洞

空洞指的是图层中被要素包围所形成的没有被要素覆盖的地方&#xff0c;当图层要素数量非常庞大时&#xff0c;寻找这些空洞就不能一个一个的通过目测去寻找了&#xff0c;需要通过使用工具来实现这一目标。 一、【要素转线】工具 利用【要素转线】工具可以将空洞同图层要素处于…

【触摸案例-多点触摸的案例 Objective-C语言】

一、我们来做这个多点触摸的案例 1.首先呢,按着这个option键啊,可以模拟多点触摸, 然后呢,再去怎么着去画圈儿, 它这个里边就会产生一个imageView,跟着你去变,会有这么一个效果, 那么,首先啊,我们新建一个项目, Name:03-多点触摸的案例 1)首先,我们把控制器的v…