如何使用来自 Eel 的 GUI 事件停止 Twisted Reactor?
How to stop a Twisted Reactor with a GUI event from Eel?
我正在构建一个 Python GUI 应用程序(使用 Eel),它使用 Twisted Reactor 持续调用网络连接的 RFID reader。收集的数据需要进行解析,GUI 需要更新。
在此循环中,GUI 也需要响应,能够停止与从 JS 前端使用 Eel 传递的函数调用的连接。这是代码现在的简化版本:
def callback(RFID_tag):
print(RFID_tag)
@eel.expose
def stopInventory():
reactor.stop()
@eel.expose
def startInventory():
RFID_factory = <SETTING UP FACTORY>
RFID_factory.addRFIDtagReportCallback(callback)
reactor.connectTCP(host, port, RFID_factory, timeout=3)
reactor.start()
这就是我遇到问题的地方。一旦我调用 reactor.run()
,脚本就会挂起。在整个脚本被终止之前,我从 JS 前端发出的任何 Eel 调用都不会在 Python 脚本中注册。
我不太确定if/how我可以使用 Twisted Reactor API 来处理这些 GUI 事件,同时继续处理来自 RFID reader 的新数据。我一直在避免尝试使用线程来解决这个问题,但我似乎找不到其他方法。
eel 有一个事件循环。 Twisted 有一个事件循环。通常,要 运行 一个线程中的两个事件循环,这些事件循环需要相互协作。
eel好像用的是gevent和gevent的事件循环。幸运的是,看起来有人已经在 Twisted 和 gevent 之间建立了集成 - https://github.com/jyio/geventreactor。不太幸运的是,它看起来并没有得到特别维护。不过,也许它可以被挽救。
我正在构建一个 Python GUI 应用程序(使用 Eel),它使用 Twisted Reactor 持续调用网络连接的 RFID reader。收集的数据需要进行解析,GUI 需要更新。
在此循环中,GUI 也需要响应,能够停止与从 JS 前端使用 Eel 传递的函数调用的连接。这是代码现在的简化版本:
def callback(RFID_tag):
print(RFID_tag)
@eel.expose
def stopInventory():
reactor.stop()
@eel.expose
def startInventory():
RFID_factory = <SETTING UP FACTORY>
RFID_factory.addRFIDtagReportCallback(callback)
reactor.connectTCP(host, port, RFID_factory, timeout=3)
reactor.start()
这就是我遇到问题的地方。一旦我调用 reactor.run()
,脚本就会挂起。在整个脚本被终止之前,我从 JS 前端发出的任何 Eel 调用都不会在 Python 脚本中注册。
我不太确定if/how我可以使用 Twisted Reactor API 来处理这些 GUI 事件,同时继续处理来自 RFID reader 的新数据。我一直在避免尝试使用线程来解决这个问题,但我似乎找不到其他方法。
eel 有一个事件循环。 Twisted 有一个事件循环。通常,要 运行 一个线程中的两个事件循环,这些事件循环需要相互协作。
eel好像用的是gevent和gevent的事件循环。幸运的是,看起来有人已经在 Twisted 和 gevent 之间建立了集成 - https://github.com/jyio/geventreactor。不太幸运的是,它看起来并没有得到特别维护。不过,也许它可以被挽救。