我有一个非常复杂的循环,这取决于网络和外围设备之类的东西,我想让它异步。
def Foo(QObject):
@pyqtSlot(int)
def complexloop(self):
do_something_complex
@pyqtSlot(int, result=int)
def something_simple(self):
return "something easy"
这个类被添加到PyQt5中的webkit窗口中,如下所示:
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.view = QWebView(self)
self.foo = Foo(self)
self.view.page().mainFrame().addToJavaScriptWindowObject("foo", self.foo)
这样,在JavaScript中,我可以调用foo.complexloop()
来启动该过程。
问题在于,当我这样做时,整个浏览器会冻结,直到循环完成。我需要一种在后台运行此循环的方法。
我已尝试使用complexloop
定义async def
,但我找不到有关如何从JavaScript调用它的任何文档。
我试图将调用包装成:
def call_loop(self):
try:
self.complex_loop.send(None)
except StopIteration:
pass
但这并没有帮助,因为对foo.call_loop()
的调用会阻止该窗口。