【问题标题】:How to properly use run_detached() and stop() in pystray?如何在 pystray 中正确使用 run_detached() 和 stop()?
【发布时间】: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


    【解决方案1】:

    如果您不需要调用线程保持可用,则使用 os._exit 进一步修改 stop() 函数以退出线程将起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2020-03-03
      • 2013-02-18
      • 2021-01-06
      相关资源
      最近更新 更多