【发布时间】:2022-04-07 03:34:20
【问题描述】:
我正在尝试在不阻塞主线程的情况下使用 pystray。根据 pystray 文档,我们可以使用函数 run_detached() 来启动而不阻塞。
我在 Windows 上使用 pystray,所以显然我不需要将任何参数传递给 run_detached() 即可工作。
我尝试的第一件事是运行这段代码:
import pystray
from pystray import MenuItem as item
from PIL import Image, ImageTk
def show_window(icon):
print('Test')
def quit_window(icon):
icon.stop()
icon = 'icon.ico'
image=Image.open(icon)
menu=pystray.Menu(item('Show', show_window, default=True), item('Quit', quit_window))
icon=pystray.Icon("name", image, "My System Tray Icon", menu)
icon.run_detached()
但是我收到了这个错误:
Exception in thread Thread-2:
Traceback (most recent call last):
File "...\lib\threading.py", line 973, in _bootstrap_inner
self.run()
File "...\lib\threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "...\lib\site-packages\pystray\_base.py", line 384, in <lambda>
threading.Thread(target=lambda: self.run(setup)).start()
NameError: name 'setup' is not defined
所以我尝试通过更改 _base.py 中的第 384 行删除设置变量来绕过此错误
#threading.Thread(target=lambda: self.run(setup)).start()
threading.Thread(target=lambda: self.run()).start()
代码按预期工作,并创建了菜单按钮正常工作的托盘图标。
问题是当我按下“退出”时,因为stop() 功能不像我使用icon.run() 时那样工作。
线程似乎继续运行,托盘图标保持冻结,程序没有结束。
有没有其他方法可以正常工作?
编辑: 我在官方 git 存储库LINK 中发现了这个问题,它似乎是一个已经报告的错误。我想知道是否可以解决问题。
【问题讨论】:
标签: python python-3.x pystray