将 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和pyinstaller gui应用程序将无法在某些Windows计算机上运行
使用 cx_freeze 冻结后的绝对路径(Qt5 / PySide2 App)