前言

由于博主昨天上班的时候忘记下班打卡了,导致全勤没掉还要扣钱,因此自己写了一个下班打卡提醒小助手,现在将阉割版的喝水小助手交给大家,全文只需三个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

Logo

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

更多推荐