使用tkinter与win10toast触发通知报ToastNotifier无classAtom属性错误如何解决
问题根因
这个AttributeError: 'ToastNotifier' object has no attribute 'classAtom'是win10toast原生库的已知缺陷:库底层调用Win32 API注册窗口类后,重复实例化ToastNotifier或者多线程并发调用时,资源销毁逻辑会提前释放classAtom属性,导致实例属性丢失报错。
修复方案
方案1:修改现有代码,复用全局实例
不需要更换依赖,只需要调整代码逻辑,避免重复创建ToastNotifier实例即可。
调整通知模块(notif2.py)代码:
from win10toast import ToastNotifier import time # 全局只初始化一次ToastNotifier实例,避免重复创建 toaster = ToastNotifier() def main(): toaster.show_toast("Hello World!!!", "Python is 10 seconds awsm!", icon_path=None, duration=1, threaded=True) # 等待当前通知展示完成,避免多线程资源冲突 while toaster.notification_active(): time.sleep(0.1) if __name__ == "__main__": main()
调整tkinter主文件代码:
import tkinter as tk from tkinter import * import notif2 window = tk.Tk() def noti(): # 删掉冗余的if __name__ == "__main__"判断,避免模块导入时功能失效 notif2.main() # 如果不需要点击一次后每秒循环弹出通知,删除下面这行即可 # window.after(1000, noti) Button(text='press',command=noti).pack() window.mainloop()
方案2:直接替换修复版依赖
win10toast已经停止维护多年,相关bug没有官方修复,你可以直接安装社区维护的修复版:pip install win10toast-persist
该库接口和原生win10toast完全一致,安装后不需要改动任何原有代码即可解决该报错。
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

