首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pyQt6 +异步:将异步函数连接为一个槽

pyQt6 +异步:将异步函数连接为一个槽
EN

Stack Overflow用户
提问于 2022-10-25 15:18:38
回答 1查看 55关注 0票数 0

有一种情况是,我希望连接使用等待的异步函数到QPushButton的单击信号。

其动机是,我需要管理一些信息绑定的东西,使用等待似乎是最有说服力的方法。问题是,当使用等待时,调用函数需要标记为异步,调用该函数的所有函数也是如此。这个“气泡到顶部”直到最终,有一个按钮点击信号,需要连接到一个异步插槽功能。我不知道该怎么做,也没有多少建议。也许我想错了,pyQt6不应该和异步混为一谈?

下面是一个例子。它只是一个带有按钮的QMainWindow,我正在尝试将按钮的点击信号连接到一个恰巧是异步的插槽函数。它只打印数字,并在打印每个数字后使用asyncio.sleep(1.0)等待1秒。

代码语言:javascript
运行
复制
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()

当我单击该按钮时,会得到以下内容,当然,没有任何打印。

代码语言:javascript
运行
复制
RuntimeWarning: coroutine 'MainWindow.my_async_func' was never awaited
  app.exec()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

如何告诉connect(...)我想使用异步函数?

我以前的经验来自于.net WPF,我希望将异步函数与UI事件联系起来并不是什么大不了的事情。

EN

回答 1

Stack Overflow用户

发布于 2022-10-25 16:47:48

好吧,我发现了一些不用太费心的东西。

我不确定这是否正确。请评论一下,如果可能的话,解释一下(我对此还不太了解)。

对于pyqt6来说,诀窍是使用Q异步创建和启动异步函数似乎可以作为参数的事件循环。异步函数还需要使用@异步also ()来修饰。

代码语言:javascript
运行
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74196406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档