Python饮水提醒程序开机自启时不显示通知问题求助
饮水提醒程序开机自启后通知不显示的解决方案
问题分析
终端运行正常但开机自启时通知不显示,核心原因可能是:
- Windows通知权限未对Python/pythonw.exe开放
- win10toast库对Python 3.11兼容性不足(该库维护停滞,适配性差)
- 开机自启程序启动过早,用户会话或通知服务未完全初始化
具体解决方案
1. 检查并开启Windows通知权限
- 打开Windows设置 → 系统 → 通知和操作
- 在“获取来自这些发送者的通知”列表中找到
Python或pythonw.exe,确保通知权限处于开启状态
2. 替换为兼容性更好的通知库
放弃老旧的win10toast,改用plyer库(跨平台,对新Python版本适配更稳定):
- 安装依赖:
pip install plyer
- 修改代码(替换通知相关逻辑):
# TODO: 使用相对路径处理.ico和.wav文件 import time from threading import Thread from plyer import notification from playsound import playsound import os import shutil shell_startup_dir = f"C:/Users/{os.getlogin()}/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup" project_dir = "C:/Users/Karmakar's PC/Documents/Arpan Karmakar/Python Programming/projects/drink-water-notifier" # 改用批处理文件实现延迟开机自启 bat_path = os.path.join(shell_startup_dir, "drink_water_notifier.bat") if not os.path.exists(bat_path): with open(bat_path, 'w', encoding='utf-8') as f: # 延迟30秒启动,确保用户会话和通知服务初始化完成 f.write(f'timeout /t 30\npythonw "{os.path.join(project_dir, "main.py")}"') def playsound_fx(): playsound(os.path.join(project_dir, "water.wav")) while True: Thread(target=playsound_fx).start() notification.notify( title="饮水提醒", message="男性每日建议摄入约15.5杯(3.7升)液体,女性约11.5杯(2.7升)。", app_icon=os.path.join(project_dir, "water.ico"), timeout=10 ) time.sleep(1800)
3. 调整开机自启的启动时机
直接复制pyw文件到启动目录会导致程序在用户会话未完全加载时启动,通知服务可能尚未就绪。通过批处理延迟启动可以解决这个问题:
- 创建上述代码中的批处理文件,替代直接复制
pyw到启动目录 - 延迟时间可根据实际情况调整(比如30-60秒)
4. 验证Pythonw.exe的执行环境
确保开机自启时使用的pythonw.exe是你当前的Python 3.11版本:
- 在批处理文件中指定完整的Pythonw路径,比如:
timeout /t 30 "C:/Python311/pythonw.exe" "C:/Users/Karmakar's PC/Documents/Arpan Karmakar/Python Programming/projects/drink-water-notifier/main.py"
内容的提问来源于stack exchange,提问作者Arpan Karmakar
相关产品推荐
相关产品推荐

