基于Python的系统托盘定时提醒工具



背景介绍

在现代办公和学习环境中,长时间连续工作已成为常态。然而,这种高强度的专注模式往往忽略了身体的健康需求,例如定时休息、喝水、拉伸等。为了帮助用户在不打断工作流程的前提下,养成良好的健康习惯,我们开发了一个基于Python的系统托盘定时提醒工具

该工具通过系统托盘图标静默运行,用户无需打开主窗口即可通过右键菜单设置提醒内容和频率。它不仅具备实用价值,还涵盖了系统托盘开发、多线程任务调度、跨平台兼容性等核心技术点,适合中级以下开发者学习和实践。


思路分析

1. 技术选型

  • pystray:用于创建系统托盘图标和菜单,支持Windows、macOS、Linux三大平台。
  • threading:用于在后台运行定时任务,避免阻塞主程序。
  • Pillow:生成系统托盘图标图像。
  • ctypes(Windows专属):用于弹出系统提示框,模拟原生弹窗提醒。

2. 功能模块划分

  • 图标与菜单:程序启动后在系统托盘显示图标,用户可通过右键菜单选择提醒类型。
  • 提醒逻辑:根据用户选择的频率(如1小时、2小时)启动定时任务。
  • 弹窗提醒:在设定时间后弹出提示框,提醒用户休息或喝水。
  • 后台运行:程序始终在后台运行,不影响用户操作。

3. 跨平台考虑

  • 使用pystray库可以自动适配不同操作系统。
  • 提醒弹窗在Windows中使用ctypes实现,其他系统可扩展为通知栏或日志输出。

代码实现

以下是一个完整的、可运行的Python示例代码,展示了如何实现一个轻量级的系统托盘定时提醒工具。该程序支持“马上提醒”、“每小时提醒”、“每两小时提醒”和“退出”功能。

# 文件名:system_reminder.py
# 编程语言:Python 3.8+

import time
import threading
import os
from PIL import Image, ImageDraw
import pystray
import ctypes  # 仅用于Windows系统弹窗

# 生成系统托盘图标(蓝色圆形)
def create_image():
    image = Image.new('RGB', (64, 64), color='white')
    draw = ImageDraw.Draw(image)
    draw.ellipse((12, 12, 52, 52), fill=(0, 150, 255))  # 蓝色圆圈
    return image

# 弹窗提醒(Windows)
def remind(message="该休息一下啦!"):
    print(message)
    ctypes.windll.user32.MessageBoxW(0, message, "💧 健康提醒", 0x40)

# 后台定时任务
def start_reminder(icon, interval_minutes, message):
    def run():
        while icon.visible:
            time.sleep(interval_minutes * 60)
            if icon.visible:
                remind(message)
    threading.Thread(target=run, daemon=True).start()

# 退出程序
def exit_program(icon, item):
    icon.stop()
    os._exit(0)

# 创建菜单项
def create_menu(icon):
    return pystray.Menu(
        pystray.MenuItem("💧 马上提醒", lambda: remind("快去喝口水吧!")),
        pystray.MenuItem("⏰ 每小时提醒一次", lambda: start_reminder(icon, 60, "每小时提醒:起身活动一下吧!")),
        pystray.MenuItem("🧘 每两小时拉伸提醒", lambda: start_reminder(icon, 120, "两小时到了,记得做做拉伸!")),
        pystray.MenuItem("❌ 退出", exit_program)
    )

# 启动系统托盘图标
def main():
    icon = pystray.Icon("健康助手", create_image(), "💧 健康提醒小助手", create_menu(icon))
    print("系统托盘提醒器已启动,图标已显示在右下角。")
    print("你可以点击托盘图标设置提醒频率。")
    icon.run()

if __name__ == "__main__":
    main()

代码说明

  1. 图标生成
    使用Pillow库创建一个64×64像素的蓝色圆形图标,作为系统托盘的显示图像。

  2. 弹窗提醒
    使用ctypes调用Windows API的MessageBoxW函数,实现原生弹窗。若需跨平台支持,可使用notify2(Linux)或osascript(macOS)替代。

  3. 定时任务
    使用threading.Thread在后台运行定时任务,避免阻塞主程序。通过time.sleep()控制提醒间隔。

  4. 菜单与事件绑定
    使用pystray.Menu创建右键菜单,并为每个菜单项绑定对应的操作函数,如立即提醒、每小时提醒等。

  5. 程序退出
    通过os._exit(0)强制退出程序,确保资源释放。


运行与测试

安装依赖

确保已安装以下Python库:

pip install pystray pillow

启动程序

运行脚本:

python system_reminder.py

程序启动后,系统托盘区会出现一个蓝色图标。右键点击图标,选择不同的菜单项即可触发对应提醒。


项目总结

本项目实现了一个基于Python的系统托盘定时提醒工具,具备以下特点:

  • 轻量级设计:无需复杂框架,适合快速开发和部署。
  • 跨平台兼容:支持Windows、macOS和Linux系统。
  • 实用性强:帮助用户在工作间隙提醒喝水、休息、拉伸,提升健康意识。
  • 学习价值高:涵盖系统托盘开发、多线程任务调度、跨平台兼容性等核心技术点。

通过该项目,开发者可以掌握如何在Python中创建系统托盘图标,并实现后台定时任务调度。这为开发更复杂的系统级工具(如日程管理器、健康监控器等)打下坚实基础。


扩展建议

  1. 支持自定义提醒内容
    可添加一个设置窗口,让用户输入自定义提醒信息和频率。

  2. 支持多提醒任务
    允许同时运行多个提醒任务,例如“每30分钟喝水”、“每2小时休息”。

  3. 增加音效提醒
    使用playsound库播放提示音,增强提醒效果。

  4. 持久化配置
    将用户设置的提醒频率和内容保存到本地文件(如JSON格式),下次启动时自动加载。

  5. 跨平台通知支持
    使用notify2(Linux)或osascript(macOS)实现系统通知,替代Windows的弹窗。


结语

系统托盘应用虽然小巧,但功能强大,是提升用户体验和工作效率的重要工具。通过本项目,我们不仅实现了一个实用的健康提醒工具,也展示了Python在桌面系统工具开发中的灵活性和强大能力。希望读者能够通过本项目,进一步探索Python在系统编程和自动化领域的更多可能。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注