步骤 1: 导入必要的库
首先,我们需要导入我们将要使用的所有库。
import threading
import time
import pystray
from PIL import Image, ImageDraw, ImageFont
import tkinter as tk
from tkinter import messagebox
步骤 2: 创建 TrayIcon 类
创建一个TrayIcon
类,它将负责所有与托盘图标相关的逻辑。
class TrayIcon:
def __init__(self):
# 初始化成员变量
self.exit_event = threading.Event()
self.icon = self.create_icon() # 假设我们有一个方法来创建图标
self.tray_thread = None
def create_icon(self):
# 创建一个简单的图标(这里只是一个红色的方块作为示例)
icon = Image.new('RGB', (16, 16), color=(255, 0, 0))
# ... 可以在这里添加更多图标创建逻辑 ...
return icon
def quit_tray_icon(self, icon, menu_item):
# 当用户点击退出时调用的回调函数
self.exit_event.set()
icon.stop()
def show_reminder(self):
# 显示提醒的函数
root = tk.Tk()
root.withdraw() # 隐藏主窗口
messagebox.showinfo("提醒", "请站起来活动一下,避免久坐!")
def run_tray_icon(self):
# 运行托盘图标的函数
menu = pystray.Menu(pystray.MenuItem("Exit", self.quit_tray_icon))
icon = pystray.Icon("My App", self.icon, "My App", menu)
icon.run()
def start(self):
# 启动托盘图标和定时任务的函数
self.tray_thread = threading.Thread(target=self.run_tray_icon, daemon=True)
self.tray_thread.start()
# 启动定时任务(这里用简单的循环模拟)
self.start_reminder_scheduler()
def start_reminder_scheduler(self):
# 定时任务的逻辑,这里使用简单循环模拟
while not self.exit_event.is_set():
# 模拟每45分钟显示一次提醒(这里用秒来模拟)
if time.time() % 2700 < 10: # 假设2700秒是45分钟(仅为示例)
self.show_reminder()
time.sleep(1)
def stop(self):
# 停止托盘图标和定时任务的函数
self.exit_event.set()
if self.tray_thread is not None:
self.tray_thread.join(timeout=1) # 等待托盘图标线程结束,但设置超时
### 步骤 3: 使用 TrayIcon 类
在主程序中,我们创建一个`TrayIcon`实例,并调用其`start`方法来启动托盘图标和定时任务。然后,我们让主线程保持运行,直到接收到`KeyboardInterrupt`异常,此时调用`stop`方法来停止所有操作。
```python
if __name__ == "__main__":
tray_icon = TrayIcon()
tray_icon.start()
try:
# 主线程可以保持运行,或者执行其他任务
while True:
time.sleep(1)
except KeyboardInterrupt:
tray_icon.stop()
print("程序已退出")
本程序经过多轮Baidu文心一言Prompt及自我测试实现。