如何使用来自 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。不太幸运的是,它看起来并没有得到特别维护。不过,也许它可以被挽救。