将 Qt Pyside2 与 asyncio await 语法一起使用?

Posted

技术标签:

【中文标题】将 Qt Pyside2 与 asyncio await 语法一起使用?【英文标题】:Use Qt Pyside2 with asyncio await syntax? 【发布时间】:2019-09-21 14:55:48 【问题描述】:

如何在pyside2的主循环中等待这个函数(src):

async def do_request(value): #asyncqt maybe possible
    #print("do request")
    await asyncio.sleep(value)
    #print("request finished")
    return value

async def eventFilter(self, source, event): #impossible, needs pyside2 rewrite
     ... 

我非常不愿意使用任何非官方的东西,所以 pyside2:我查看了 pyside2 的示例,其中包含 Qthreads 示例,但没有 asyncio await。我的库使用 asyncio 那么如何在 pyside2 中等待?

这是一个严重的问题:https://github.com/harvimt/quamash/issues/104 不支持 pyside2 并且 https://github.com/gmarull/asyncqt 未维护。解决办法是什么? 请问如何集成这样简单的调用。我担心非维护的 repos 上的中断/错误

【问题讨论】:

两种方式我都没有投票,但是如果您将鼠标悬停在向下投票箭头上,您总能看到原因。没有人有义务提供任何进一步的解释。 【参考方案1】:

在观看https://www.youtube.com/watch?v=ol5IuJyw-Tg 之后,使用内置的qthread qrunnable qthread 不阻塞主 gui 线程是可行的方法。

例子见https://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples/corelib 并浏览源代码(它的pyside2)

【讨论】:

【参考方案2】:

PyQt 非常流行。尽管由于许可问题,有些人可能不想要它。无论您选择 PyQt 还是 PySide,QTimer 都有一些非常好的功能。特别是,您可以使用singleShot() 方法以特定延迟运行代码。

from PySide2.QtCore import QTimer

def myfunc():
    # do your stuff here
    pass

def do_request(self, value):
    # call static function singleShot
    QTimer.singleShot( delay_msec, myfunc)

您也可以start() 一个 QTimer 在常规的interval 上运行任务。

【讨论】:

会否决:不与异步等待库相关联,而 pyside2 是官方的方式。 你是对的。这里没有异步。我放弃了 QTimer,因为它有一些不错的功能,您可以使用它们来代替。

以上是关于将 Qt Pyside2 与 asyncio await 语法一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何指示 PySide2 应用程序使用 qt5ct 设置?

如何在 PySide2 中检查 gui 与命令行模式?

PySide2和pyinstaller gui应用程序将无法在某些Windows计算机上运行

使用 cx_freeze 冻结后的绝对路径(Qt5 / PySide2 App)

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

PySide2(Qt for Python)在 Linux 上的 Qt Designer 安装在哪里?