You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6中如何将async异步函数连接为QPushButton的槽函数

解决PyQt6异步槽函数连接问题

PyQt的信号槽机制无法直接识别并执行async协程函数,直接连接后只会生成协程对象但不会触发执行,这就是你看到警告的原因。要实现类似.NET WPF的异步事件绑定体验,可以通过以下几种方式处理:

方法1:用同步包装函数启动协程

写一个同步的中间函数,在其中用asyncio.create_task启动异步函数,这样既不会阻塞UI线程,又能正确执行协程:

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.on_button_clicked)

    def on_button_clicked(self):
        # 启动异步任务,无需等待,避免阻塞UI
        asyncio.create_task(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()

方法2:整合Qt事件循环与asyncio(适配重度异步场景)

如果你的项目大量使用异步操作,可以将PyQt的事件循环和asyncio的事件循环整合,这样能更自然地在协程中处理UI交互与异步任务:

import sys
import asyncio
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt6.QtCore import QTimer


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")


async def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    # 用QTimer让两个事件循环协同工作
    timer = QTimer()
    timer.timeout.connect(lambda: asyncio.get_event_loop().stop())
    timer.start(50)

    while app.applicationState():
        asyncio.get_event_loop().run_until_complete(asyncio.sleep(0.05))
        app.processEvents()

if __name__ == "__main__":
    asyncio.run(main())

关键说明

  • 方法1适合简单场景,无需修改原有Qt事件循环的使用逻辑,快速解决问题。
  • 方法2适合重度异步项目,让Qt与asyncio的事件循环兼容,流畅处理异步任务与UI交互。

内容的提问来源于stack exchange,提问作者Angelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:30:50