我正在开发一个用于实时对象检测的应用程序,可以通过语音命令打开它。程序中也没有错误,但问题是每次我运行程序时,flet 窗口都会这样说
ValueError:信号仅在主解释器的主线程中工作
但问题是我可以看到我在后台添加的对象。我不知道为什么会收到此错误,而且我以前从未遇到过此错误,请帮助,因为我需要在 2 天内完成我的项目
源代码已链接,以便您可以看到问题所在,请帮助我
我下载了你的源代码,编译了正确版本的Python,安装了所有先决条件,并且能够重现你的问题。
在
main()
函数中,有这一行:
app(target=main)
但最后还有这一行:
if __name__ == "__main__":
app(target=main)
这意味着它正在尝试调用自己。如果这有效,你就会得到无限递归和堆栈溢出。删除第一个
app(target=main)
。
发生的事情是它试图注册信号处理程序(信号是程序中发生的事件,如
^C
、分段错误、挂起、管道损坏等),但这必须是在 Python 主线程中完成。当您调用 app()
时,它正在设置一个信号处理程序并为 main()
创建另一个执行线程,然后执行 main()
,它再次调用 app()
,它尝试再次设置信号处理程序(并且会称为 main()
,直到内存耗尽),但这失败了,因为您位于线程中,而不是执行主线中。
发生此问题时,屏幕上会显示回溯;当您发布问题时,请务必发布此回溯,例如:
File "/home/vercingatorix/src/git/Drusthi/test.py", line 86, in main
app(target=main)
File "/home/vercingatorix/src/git/Drusthi/so2/lib/python3.11/site-packages/flet_runtime/app.py", line 70, in app
return asyncio.run(
^^^^^^^^^^^^
File "/home/vercingatorix/.pyenv/versions/3.11.9/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/home/vercingatorix/.pyenv/versions/3.11.9/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/vercingatorix/.pyenv/versions/3.11.9/lib/python3.11/asyncio/base_events.py", line 654, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/home/vercingatorix/src/git/Drusthi/so2/lib/python3.11/site-packages/flet_runtime/app.py", line 148, in app_async
signal.signal(signal.SIGINT, exit_gracefully)
File "/home/vercingatorix/.pyenv/versions/3.11.9/lib/python3.11/signal.py", line 58, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: signal only works in main thread of the main interpreter
这对于调试问题至关重要。
如果这解决了您的问题令您满意,请将答案标记为“已接受”!先感谢您;非常感谢!