Python使用pystray启动托盘后后续代码无法执行问题求解
问题原因
pystray的Icon.run()是阻塞调用方法,启动后会持续占用当前线程处理托盘图标的交互事件,只有当你触发Exit菜单执行icon.stop()退出托盘进程后,该方法才会返回,执行后续的循环代码,这就是当前现象的根本原因。
解决方案
使用多线程将托盘逻辑和你的业务代码拆分到不同线程运行即可,修改后的可运行代码如下:
from pystray import MenuItem as item import pystray from PIL import Image import time import threading def action(): pass def exit(icon): icon.stop() def run_tray_icon(): image = Image.open("image.PNG") menu = (item('name', action), item('Exit', exit)) icon = pystray.Icon("A", image, "B", menu) icon.run() if __name__ == "__main__": # 将托盘逻辑放到子线程运行,daemon参数设置为True可让主程序退出时自动销毁托盘线程 tray_thread = threading.Thread(target=run_tray_icon, daemon=True) tray_thread.start() # 主线程继续执行业务逻辑 i = 0 while i != 50: print('test') time.sleep(1) i += 1
补充说明
- 如果你需要在业务逻辑执行完毕后自动关闭托盘,可以将
icon变量定义为全局变量,在循环结束后调用icon.stop()即可。 - 如果你希望业务逻辑跑完后托盘仍保持运行,去掉
daemon=True参数即可,此时程序会等待托盘手动退出后才会完全结束。
内容的提问来源于stack exchange,提问作者Rabe
相关产品推荐
相关产品推荐

