PyQt5打造桌面日程提醒工具
效果图

在快节奏的工作和学习中,你是否也常常陷入这样的困境:忙碌起来忘记重要会议、错过作业截止时间、待办事项堆积如山却毫无头绪?手机提醒容易被消息淹没,电脑端又没有轻便好用的专属小工具,第三方软件广告繁多、功能臃肿,还担心隐私泄露……想要一款纯本地、无广告、轻量化、功能齐全的桌面日程提醒工具,真的这么难吗?
今天就给大家带来一份超实用的干货教程!我们将用Python的PyQt5库,从零开发一款专属的桌面日程提醒工具,集桌面定时弹窗提醒、待办事项增删改查、时间自动监控、界面简洁美观于一体,完全本地运行,不用联网、没有广告,所有数据自己掌控,代码简单易懂,新手也能轻松上手。
这款工具不仅能解决日常效率痛点,还能让你快速掌握PyQt5界面开发、定时器使用、文件数据存储、弹窗提醒等核心技能,无论是自用还是学习PyQt5,都是绝佳的实战项目。接下来,我们就一步步拆解开发流程,从功能设计到代码实现,带你打造属于自己的高效日程助手!
一、项目核心功能预览
本次开发的日程提醒工具包含三大核心功能:
-
待办事项管理:支持添加任务名称、设置提醒时间、删除已完成/不需要的任务,实时展示所有待办; -
桌面定时提醒:后台自动监控时间,到达设定时间立即弹出桌面提醒窗口,醒目不遗漏; -
数据持久化:任务数据自动保存到本地文件,关闭软件再打开,待办事项不会丢失。
界面采用简约风格,布局清晰,操作简单,无需复杂配置,打开即用。
二、核心代码模块详细解析
我们将项目拆分为界面布局模块、核心功能模块、数据存储模块三部分,逐一讲解核心逻辑,让你看懂每一行代码的作用。
模块1:主界面布局设计(PyQt5基础布局+组件)
这是工具的”门面”,我们使用QVBoxLayout垂直布局+QHBoxLayout水平布局组合,搭配输入框、按钮、列表、标签等基础组件,搭建简洁易用的界面。
-
顶部:任务名称输入框+提醒时间选择框,用于添加新待办; -
中部:添加/删除按钮,控制待办事项; -
底部:待办事项列表,实时展示所有任务; -
定时器:后台实时监控时间,触发提醒。
PyQt5的布局管理器会自动适配组件大小,不用手动调整位置,新手也能快速做出美观界面。
模块2:定时提醒核心功能(QTimer定时器+弹窗提醒)
这是工具的核心!我们使用PyQt5的QTimer定时器,每隔1秒刷新一次时间,对比当前时间与任务提醒时间,一旦匹配,立即触发QMessageBox弹窗提醒。
-
定时器精度高,后台轻量运行,不占用电脑资源; -
弹窗采用信息提示框,置顶显示,确保你能第一时间看到提醒; -
时间对比精准到分钟,避免漏提醒、错提醒。
同时,我们绑定按钮的点击事件,实现添加任务、删除任务的交互逻辑,让界面和功能联动。
模块3:数据持久化存储(本地文件保存任务数据)
为了让关闭软件后任务不丢失,我们使用JSON文件存储待办数据。JSON格式轻量易读,Python自带json库即可操作,无需安装第三方数据库。
-
添加任务时,自动将任务名称、提醒时间写入本地json文件; -
打开软件时,自动读取文件数据,加载到待办列表; -
删除任务时,同步更新文件数据,保证数据一致性。
三、完整项目代码
直接复制以下代码,保存为schedule_reminder.py,安装依赖后即可运行!
import sysimport jsonimport datetimefrom PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QListWidget, QListWidgetItem, QMessageBox, QDateTimeEdit)from PyQt5.QtCore import QTimer, QDateTime, Qt# 本地数据存储文件DATA_FILE = "todo_list.json"classScheduleReminder(QMainWindow):def__init__(self): super().__init__() self.setWindowTitle("桌面日程提醒工具") # 窗口标题 self.setFixedSize(500, 400) # 固定窗口大小 self.todo_list = [] # 存储待办事项# 初始化UI界面 self.init_ui()# 加载本地存储的任务数据 self.load_todo_data()# 初始化定时器(每秒检查一次时间) self.timer = QTimer(self) self.timer.timeout.connect(self.check_reminder) self.timer.start(1000)definit_ui(self):"""初始化界面布局"""# 主部件与布局 central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) layout.setSpacing(10) layout.setContentsMargins(20, 20, 20, 20)# 1. 任务名称输入区域 name_layout = QHBoxLayout() name_label = QLabel("任务名称:") self.task_input = QLineEdit() self.task_input.setPlaceholderText("请输入待办事项(如:开会、写作业)") name_layout.addWidget(name_label) name_layout.addWidget(self.task_input) layout.addLayout(name_layout)# 2. 提醒时间选择区域 time_layout = QHBoxLayout() time_label = QLabel("提醒时间:") self.time_input = QDateTimeEdit()# 设置默认时间为当前时间 self.time_input.setDateTime(QDateTime.currentDateTime())# 设置时间显示格式 self.time_input.setDisplayFormat("yyyy-MM-dd HH:mm") time_layout.addWidget(time_label) time_layout.addWidget(self.time_input) layout.addLayout(time_layout)# 3. 功能按钮区域 btn_layout = QHBoxLayout() self.add_btn = QPushButton("添加待办") self.add_btn.clicked.connect(self.add_todo) # 绑定添加事件 self.del_btn = QPushButton("删除选中") self.del_btn.clicked.connect(self.delete_todo) # 绑定删除事件 btn_layout.addWidget(self.add_btn) btn_layout.addWidget(self.del_btn) layout.addLayout(btn_layout)# 4. 待办事项列表 list_label = QLabel("待办事项列表:") self.todo_list_widget = QListWidget() layout.addWidget(list_label) layout.addWidget(self.todo_list_widget)defload_todo_data(self):"""从本地文件加载待办数据"""try:with open(DATA_FILE, "r", encoding="utf-8") as f: self.todo_list = json.load(f)# 刷新列表显示 self.refresh_list_widget()except FileNotFoundError:# 文件不存在则创建空列表 self.todo_list = []defsave_todo_data(self):"""保存待办数据到本地文件"""with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(self.todo_list, f, ensure_ascii=False, indent=2)defrefresh_list_widget(self):"""刷新待办列表显示""" self.todo_list_widget.clear()for todo in self.todo_list: item_text = f"【{todo['time']}】{todo['name']}" item = QListWidgetItem(item_text) item.setTextAlignment(Qt.AlignLeft) self.todo_list_widget.addItem(item)defadd_todo(self):"""添加待办事项""" task_name = self.task_input.text().strip() task_time = self.time_input.dateTime().toString("yyyy-MM-dd HH:mm")# 校验输入ifnot task_name: QMessageBox.warning(self, "提示", "请输入任务名称!")return# 添加到任务列表 self.todo_list.append({"name": task_name, "time": task_time})# 保存数据 self.save_todo_data()# 刷新列表 self.refresh_list_widget()# 清空输入框 self.task_input.clear() QMessageBox.information(self, "成功", "待办事项添加成功!")defdelete_todo(self):"""删除选中的待办事项""" selected_item = self.todo_list_widget.currentRow()if selected_item == -1: QMessageBox.warning(self, "提示", "请选择要删除的待办事项!")return# 删除对应任务del self.todo_list[selected_item]# 保存并刷新 self.save_todo_data() self.refresh_list_widget() QMessageBox.information(self, "成功", "待办事项删除成功!")defcheck_reminder(self):"""检查是否到达提醒时间""" now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")for todo in self.todo_list:if todo["time"] == now:# 弹出提醒窗口 self.show_reminder(todo["name"])defshow_reminder(self, task_name):"""弹出桌面提醒""" reminder = QMessageBox() reminder.setWindowTitle("日程提醒") reminder.setText(f"⏰ 提醒:{task_name}") reminder.setIcon(QMessageBox.Information) reminder.setWindowFlags(Qt.WindowStaysOnTopHint) # 置顶显示 reminder.exec_()if __name__ == "__main__": app = QApplication(sys.argv) window = ScheduleReminder() window.show() sys.exit(app.exec_())
四、运行步骤
-
安装依赖:打开命令提示符,执行命令 pip install pyqt5 -
运行代码:将代码保存后,直接运行 schedule_reminder.py; -
使用工具:输入任务名称、选择提醒时间,点击「添加待办」即可;选中任务点击「删除选中」可删除;到达时间自动弹窗提醒。
五、知识点总结+拓展场景
核心知识点总结
-
PyQt5界面开发:掌握主窗口、布局管理器(QVBoxLayout/QHBoxLayout)、基础组件(输入框、按钮、列表、时间选择器)的使用; -
定时器应用: QTimer实现后台定时任务,是桌面工具实时监控的核心; -
事件绑定:按钮点击事件、定时器超时事件,实现界面交互逻辑; -
数据持久化:JSON文件存储本地数据,轻量无依赖,适合小型工具数据管理; -
弹窗提醒: QMessageBox实现桌面置顶弹窗,满足提醒需求。
拓展场景
-
功能升级:添加任务分类、任务优先级、重复提醒(每日/每周)、提醒铃声; -
界面美化:更换主题颜色、添加图标、调整窗口大小自适应; -
数据升级:替换为SQLite数据库,支持更多任务数据管理; -
打包分发:用PyInstaller打包为exe文件,无需Python环境,双击即可运行,分享给他人使用。
测试步骤
-
基础测试:添加任意任务,设置近一分钟后的时间,检查是否正常弹窗提醒; -
数据测试:关闭软件重新打开,检查任务是否保留; -
功能测试:测试添加空任务、删除未选中任务,校验提示是否正常; -
精度测试:设置不同时间的任务,验证提醒时间是否精准。
这款小巧的日程提醒工具,完美解决了桌面待办管理和定时提醒的核心需求,代码简洁、功能实用,既是效率神器,也是PyQt5入门的绝佳实战项目。赶紧动手试试,打造属于自己的专属效率工具吧!
总结
-
本文用PyQt5实现了待办管理+定时提醒的桌面工具,代码完整可直接运行; -
核心依赖PyQt5的布局、定时器、弹窗和JSON数据存储,新手易理解; -
工具本地运行无广告,可拓展性强,能满足个性化效率需求。
夜雨聆风