pystray 与其他代码执行

问题描述

我需要一个代码来启动托盘图标并执行其他部分的代码...

为此,我尝试了以下方法

from pystray import MenuItem as item
import pystray
from PIL import Image,ImageDraw
import time

def action():
    pass

def exit(icon):
    icon.stop()

image = Image.open("image.PNG")
menu = (item('name',action),item('Exit',exit))
icon = pystray.Icon("A",image,"B",menu)
i = 0
icon.run()
while i != 50:
    print('test')
    time.sleep(1)
    i += 1

这会启动托盘图标,但不会执行我的循环。 (它只在我停止图标后执行

解决方法

根据文档 (https://pystray.readthedocs.io/en/latest/reference.html),pystray.Icon.run() 会阻塞直到 stop()。您可以向它传递一个回调,但该回调将在单独的线程上运行。

def foo(icon):
    icon.visible = True
    i = 0
    while i <= 5:
        print('test')
        time.sleep(1)
        i += 1
    print('now blocking until stop()...')

image = Image.open("image.PNG")
menu = (item('name',action),item('Exit',exit))
icon = pystray.Icon("A",image,"B",menu)
icon.run(foo)