打工人必备!Python提醒小助手开发指南
本文介绍了一个基于Python和PyQt6的简易喝水提醒工具开发过程。项目包含三个核心文件:main.py(程序入口)、gui.py(界面实现)和reminder.py(提醒逻辑)。程序具备时间设置、自定义提醒内容和系统托盘图标等功能。通过QTimer定时检测时间,到达设定时间时会弹出提醒窗口并保持窗口置顶。文章详细解析了模块间的调用关系、UI组件使用方法以及定时提醒的实现原理。该项目适合Pyth
前言
由于博主昨天上班的时候忘记下班打卡了,导致全勤没掉还要扣钱,因此自己写了一个下班打卡提醒小助手,现在将阉割版的喝水小助手交给大家,全文只需三个Python文件和一些简单的Python库,易做易上手,作为一个python新手的小锻炼还是不错的。
项目地址在文章最下方附带
运行效果
📦 第一章:项目准备与环境搭建
1.1 安装Python
-
前往Python官网下载最新版本
-
安装时勾选"Add Python to PATH"选项
-
验证安装:命令行输入
python --version
1.2 安装PyQt6
pip install PyQt6
1.3 项目结构
water_reminder/
├── main.py # 程序入口
├── gui.py # 图形界面
├── reminder.py # 提醒逻辑
└── assets/
└── icon.ico # 托盘图标
1)三个文件之间的调用关系
① main.py
—— 程序入口
-
作用:负责启动程序,初始化 PyQt 应用对象,创建界面窗口。
-
调用:它导入了
gui.py
中的WaterReminderWindow
类。 -
流程:
-
创建
QApplication
实例(Qt程序必备)。 -
创建
WaterReminderWindow
窗口实例。 -
调用窗口的
.show()
使窗口显示(其实是在WaterReminderWindow.__init__
里已经显示了)。 -
启动应用的事件循环
.exec()
,让程序持续运行。
-
② gui.py
—— 界面和主程序逻辑
-
作用:实现主窗口界面和用户交互,包含定时提醒的启动,系统托盘图标管理。
-
调用:
-
从
reminder.py
导入Reminder
类,用来处理提醒逻辑。
-
-
流程:
-
初始化界面控件(时间选择器、文本框、按钮)。
-
绑定按钮事件,调用
Reminder
类的start
方法启动提醒。 -
管理系统托盘图标和菜单(右键菜单、显示窗口、退出程序)。
-
管理关闭窗口时隐藏到托盘,而不是退出程序。
-
③ reminder.py
—— 提醒核心逻辑
-
作用:实现提醒时间的检测和提醒弹窗的显示。
-
调用:不调用其他模块,但会被
gui.py
中的WaterReminderWindow
创建并调用。 -
流程:
-
定义一个
Reminder
类,里面有一个QTimer
定时器,每秒检查当前时间。 -
如果当前时间匹配设定时间,则调用
show_reminder()
弹窗提醒。 -
避免在同一分钟内重复提醒。
-
2)简单关系示意图
main.py
│
└──> WaterReminderWindow (来自 gui.py)
│
└──> Reminder (来自 reminder.py)
-
main.py
创建和启动了WaterReminderWindow
窗口。 -
WaterReminderWindow
内部创建了一个Reminder
对象,调用它来启动和停止提醒。 -
Reminder
负责具体的时间检测和弹窗提醒。
💻 第二章:main.py 完全解析
2.1 代码全貌
from PyQt6.QtWidgets import QApplication
import sys
from gui import WaterReminderWindow
if __name__ == "__main__":
app = QApplication(sys.argv)
window = WaterReminderWindow()
sys.exit(app.exec())
2.2 模块详解
2.2.1 PyQt6.QtWidgets.QApplication
-
功能:管理应用程序的控制流和主要设置
-
关键方法:
-
QApplication(sys.argv)
:构造函数,接收命令行参数 -
exec()
:进入主事件循环,等待用户操作
-
2.2.2 sys模块
-
功能:访问与Python解释器相关的变量和函数
-
使用函数:
-
sys.argv
:获取命令行参数列表 -
sys.exit()
:退出程序
-
2.2.3 if name == "__main__":
-
作用:确保代码只在直接运行时执行,被导入时不执行
🖥️ 第三章:gui.py 深度剖析
3.1 导入模块完全解析
import sys
import os
from PyQt6.QtWidgets import (
QWidget, QVBoxLayout, QTimeEdit, QTextEdit, QPushButton, QMessageBox,
QSystemTrayIcon, QMenu, QApplication
)from PyQt6.QtGui import QIcon, QAction
from PyQt6.QtCore import QTime, Qt
from reminder import Reminder
3.1.1 PyQt6.QtWidgets 组件
组件 | 功能 | 常用方法 |
QWidget | 所有UI组件的基类 | setWindowTitle(), resize(), show() |
QVBoxLayout | 垂直布局管理器 | addWidget(), setLayout() |
QTimeEdit | 时间输入控件 | time(), setTime(), setDisplayFormat() |
QTextEdit | 多行文本编辑器 | toPlainText(), setPlaceholderText() |
QPushButton | 按钮 | setText(), clicked.connect() |
QMessageBox | 消息对话框 | setText(), setWindowTitle(), exec() |
QSystemTrayIcon | 系统托盘图标 | show(), setContextMenu(), showMessage() |
QMenu | 右键菜单 | addAction(), addSeparator() |
3.1.2 PyQt6.QtGui 组件
组件 | 功能 | 常用方法 |
QIcon | 图标处理 | QIcon(文件路径) |
QAction | 菜单项动作 | setText(), triggered.connect() |
3.1.3 PyQt6.QtCore 组件
组件 | 功能 | 常用方法 |
QTime | 时间处理 | currentTime(), hour(), minute() |
Qt | 包含各种枚举常量 | WindowType.WindowStaysOnTopHint |
3.2 WaterReminderWindow 类实现
3.2.1 初始化方法
def __init__(self):
super().__init__()
self.setWindowTitle("喝水小助手") # 设置窗口标题
self.resize(300, 200) # 设置窗口大小
# 创建布局和控件
layout = QVBoxLayout()
# 时间输入框
self.time_edit = QTimeEdit()
self.time_edit.setDisplayFormat("HH:mm") # 设置时间显示格式
self.time_edit.setTime(QTime.currentTime()) # 设置为当前时间
# 提醒内容输入
self.text_edit = QTextEdit()
self.text_edit.setPlaceholderText("输入提醒内容") # 设置提示文本
# 开始按钮
self.start_btn = QPushButton("开始提醒")
self.start_btn.clicked.connect(self.start_reminder) # 连接点击信号
# 将控件添加到布局
layout.addWidget(self.time_edit)
layout.addWidget(self.text_edit)
layout.addWidget(self.start_btn)
self.setLayout(layout) # 应用布局
# 初始化提醒系统
self.reminder = Reminder(self)
# 设置系统托盘图标
self.setup_tray_icon()
self.show() # 显示窗口
3.2.2 系统托盘图标设置
def setup_tray_icon(self):
# 获取图标路径(兼容打包后的情况)
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
icon_path = os.path.join(base_path, 'assets', 'icon.ico')
# 创建托盘图标
self.tray_icon = QSystemTrayIcon(QIcon(icon_path))
self.tray_icon.setToolTip("喝水小助手") # 鼠标悬停提示
# 创建右键菜单
self.menu = QMenu()
# 添加菜单项
self.show_action = QAction("显示主界面")
self.quit_action = QAction("退出程序")
# 连接菜单项信号
self.show_action.triggered.connect(self.show_window)
self.quit_action.triggered.connect(self.quit_app)
# 将菜单项添加到菜单
self.menu.addAction(self.show_action)
self.menu.addAction(self.quit_action)
# 设置托盘图标的上下文菜单
self.tray_icon.setContextMenu(self.menu)
self.tray_icon.show() # 显示托盘图标
3.2.3 关键方法实现
① start_reminder - 开始提醒
def start_reminder(self):
# 获取用户设置的时间和内容
time = self.time_edit.time()
content = self.text_edit.toPlainText().strip()
# 如果内容为空,使用默认提醒
if not content:
content = "喝水时间到啦!多喝热水 ❤️"
# 启动提醒
self.reminder.start(time, content)
# 显示设置成功的提示
msg = QMessageBox(self)
msg.setWindowTitle("提示")
msg.setText(f"提醒已设置为每天 {time.toString('HH:mm')}")
msg.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint) # 设置窗口置顶
msg.exec()
② closeEvent - 关闭事件处理
def closeEvent(self, event):
# 忽略默认的关闭行为
event.ignore()
# 隐藏主窗口
self.hide()
# 显示托盘通知
self.tray_icon.showMessage(
"喝水小助手",
"程序已最小化到托盘,右键点击图标可操作",
QSystemTrayIcon.MessageIcon.Information,
3000 # 显示3秒
)
③ show_window - 显示窗口
def show_window(self):
self.show() # 显示窗口
self.raise_() # 将窗口置于顶层
self.activateWindow() # 激活窗口
④ quit_app - 退出应用
def quit_app(self):
self.tray_icon.hide() # 隐藏托盘图标
QApplication.quit() # 退出应用
⏰ 第四章:reminder.py 完全指南
4.1 导入模块
from PyQt6.QtCore import QTimer, QTime, Qt
from PyQt6.QtWidgets import QMessageBox
模块功能说明:
模块/类 | 功能 |
QTimer | 定时器,用于定期检查时间 |
QTime | 处理时间相关操作 |
Qt | 包含各种枚举常量 |
QMessageBox | 显示提醒消息框 |
4.2 Reminder 类实现
4.2.1 初始化方法
def __init__(self, parent):
self.parent = parent # 父窗口引用
self.timer = QTimer() # 创建定时器
self.timer.timeout.connect(self.check_time) # 连接超时信号
# 初始化变量
self.reminder_time = None # 提醒时间
self.reminder_content = "" # 提醒内容
self.has_reminded_today = False # 防止重复提醒标志
4.2.2 核心方法
① start - 启动提醒
def start(self, time_qtime, content):
self.reminder_time = time_qtime # 设置提醒时间
self.reminder_content = content # 设置提醒内容
self.has_reminded_today = False # 重置提醒标志
self.timer.start(1000) # 启动定时器,每1000ms(1秒)检查一次
② stop - 停止提醒
def stop(self):
self.timer.stop() # 停止定时器
③ check_time - 检查时间
def check_time(self):
now = QTime.currentTime() # 获取当前时间
# 检查是否到达提醒时间
if (now.hour() == self.reminder_time.hour() and
now.minute() == self.reminder_time.minute()):
# 防止同一分钟内多次提醒
if not self.has_reminded_today:
self.has_reminded_today = True
self.show_reminder()
else:
# 过了时间点后重置状态
self.has_reminded_today = False
④ show_reminder - 显示提醒
def show_reminder(self):
msg = QMessageBox(self.parent)
msg.setWindowTitle("喝水提醒")
msg.setText(self.reminder_content or "喝水时间到啦!多喝热水 ❤️")
msg.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint) # 窗口置顶
msg.exec()
🛠️ 第五章
5.1 功能扩展
-
多时段提醒:
-
添加多个时间设置控件
-
使用列表存储多个提醒时间
-
-
自定义声音提醒:
-
使用
QSoundEffect
播放自定义提示音
-
-
日志记录:
-
记录每次提醒的时间和用户操作
-
5.2 代码优化
-
错误处理:
try:
icon = QIcon(icon_path)
except Exception as e:
print(f"加载图标失败: {e}")
icon = QIcon.fromTheme("alarm")
-
配置保存:
-
使用
QSettings
保存用户设置
-
附件
项目地址:https://github.com/lemonsuqing/DrinkHelper

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)