You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 16:15:08