有一种情况是,我希望连接使用等待的异步函数到QPushButton的单击信号。
其动机是,我需要管理一些信息绑定的东西,使用等待似乎是最有说服力的方法。问题是,当使用等待时,调用函数需要标记为异步,调用该函数的所有函数也是如此。这个“气泡到顶部”直到最终,有一个按钮点击信号,需要连接到一个异步插槽功能。我不知道该怎么做,也没有多少建议。也许我想错了,pyQt6不应该和异步混为一谈?
下面是一个例子。它只是一个带有按钮的QMainWindow,我正在尝试将按钮的点击信号连接到一个恰巧是异步的插槽函数。它只打印数字,并在打印每个数字后使用asyncio.sleep(1.0)
等待1秒。
import sys
import asyncio
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Press This")
self.setCentralWidget(button)
button.clicked.connect(self.my_async_func)
async def my_async_func(self):
for x in range(1,10):
print(x)
await asyncio.sleep(1.0)
print("all done")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
当我单击该按钮时,会得到以下内容,当然,没有任何打印。
RuntimeWarning: coroutine 'MainWindow.my_async_func' was never awaited
app.exec()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
如何告诉connect(...)
我想使用异步函数?
我以前的经验来自于.net WPF,我希望将异步函数与UI事件联系起来并不是什么大不了的事情。
发布于 2022-10-25 16:47:48
好吧,我发现了一些不用太费心的东西。
我不确定这是否正确。请评论一下,如果可能的话,解释一下(我对此还不太了解)。
对于pyqt6来说,诀窍是使用Q异步创建和启动异步函数似乎可以作为参数的事件循环。异步函数还需要使用@异步also ()来修饰。
import sys
import asyncio
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
from qasync import QEventLoop, asyncSlot
class MainWindow(QMainWindow):
def __init__(self, loop=None):
super().__init__()
button = QPushButton("Press This")
self.setCentralWidget(button)
button.clicked.connect(self.my_async_func)
self.loop = loop or asyncio.get_event_loop()
@asyncSlot()
async def my_async_func(self):
for x in range(1,10):
print(x)
await asyncio.sleep(1.0,self.loop)
print("all done")
def main():
app = QApplication(sys.argv)
loop = QEventLoop(app)
asyncio.set_event_loop(loop)
window = MainWindow(loop)
window.show()
with loop:
loop.run_forever()
if __name__ == '__main__':
main()
https://stackoverflow.com/questions/74196406
复制相似问题