我正在尝试创建一个基于PyQt5和asyncio的新应用程序(使用python 3.4,期待最终使用async/await升级到3.5).我的目标是使用asyncio,以便即使应用程序等待某些连接的硬件完成操作,GUI也能保持响应.
在查看如何合并Qt5和asyncio的事件循环时,我发现了一个邮件列表发布,建议使用quamash.但是,在运行此示例(未修改)时,
yield from fut
Run Code Online (Sandbox Code Playgroud)
nevers似乎又回来了.我看到输出'Timeout',所以定时器回调显然会触发,但Future未能唤醒等待方法.当手动关闭窗口时,它告诉我有未完成的期货:
Yielding until signal...
Timeout
Traceback (most recent call last):
File "pyqt_asyncio_list.py", line 26, in <module>
loop.run_until_complete(_go())
File "/usr/local/lib/python3.5/site-packages/quamash/__init__.py", line 291, in run_until_complete
raise RuntimeError('Event loop stopped before Future completed.')
RuntimeError: Event loop stopped before Future completed.
Run Code Online (Sandbox Code Playgroud)
我在使用python 3.5的Ubuntu和使用3.4的Windows上测试了这个,在两个平台上都有相同的行为.
无论如何,由于这不是我实际尝试实现的,我还测试了一些其他代码:
import quamash
import asyncio
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
@asyncio.coroutine
def op():
print('op()')
@asyncio.coroutine
def slow_operation():
print('clicked')
yield from op()
print('op done')
yield from asyncio.sleep(0.1)
print('timeout expired') …Run Code Online (Sandbox Code Playgroud) 我正在设计一个Python应用程序,它应该访问一台机器来执行一些(冗长的)任务.对于与网络相关的所有内容,asyncio模块似乎是一个不错的选择,但现在我需要访问一个特定组件的串行端口.我已经为实际的串口实现了一种抽象层,但是无法弄清楚如何将它与asyncio明智地集成在一起.
下面的设置:我有一个运行循环的线程,它经常与机器对话并解码响应.使用一种方法enqueue_query(),我可以将一个查询字符串放入一个队列,然后由另一个线程将其发送到机器并引发响应.通过传入threading.Event(或带有set()方法的任何东西),调用者可以执行阻塞等待响应.这可能看起来像这样:
f = threading.Event()
ch.enqueue_query('2 getnlimit', f)
f.wait()
print(ch.get_query_responses())
Run Code Online (Sandbox Code Playgroud)
我的目标是将这些行放入协程并让asyncio处理这个等待,以便应用程序可以在此期间执行其他操作.我怎么能这样做?它可能会通过将其包装f.wait()到Executor中来实现,但这似乎有点愚蠢,因为这会创建一个新线程,只是等待另一个线程做某事.
谢谢!最好的问候,菲利普
考虑以下最小工作示例:
#!/usr/bin/env python3
from PySide6.QtCore import QTimer
from PySide6.QtWidgets import QLabel, QApplication
app = QApplication()
label = QLabel('Label')
x = 0
def timeout():
global x
x += 1
label.setText(str(x))
timer = QTimer()
timer.timeout.connect(timeout)
timer.start(200)
label.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)
它显示一个标签(一个非常小的窗口),其中包含一个递增计数器。这一切正常。但是,我使用 PyLance 扩展在 Visual Studio Code 中进行开发,并且 IDE 不知道以下timeout信号QTimer:
公平地说,按下F12打开QtCore.pyi的定义QTimer,这实际上不包含成员timeout:
class QTimer(PySide6.QtCore.QObject):
def __init__(self, parent:Optional[PySide6.QtCore.QObject]=...) -> None: ...
def interval(self) -> int: ...
def isActive(self) -> bool: ... …Run Code Online (Sandbox Code Playgroud) 前段时间,我有一台运行Debian的新单板计算机,最终将成为学校项目的"核心".
现在,我正在使用有线网络和ssh访问机载发行版.只要这个东西放在我的桌面上就可以了,但是当它被内置到机器人中时它就是目标.我设法使用廉价的USB-BT适配器建立蓝牙连接,但现在我被困在一个rfcomm设备,并没有关于如何继续的线索.
我最想要的是让蓝牙连接提供的虚拟串口的行为就像真正的串口一样.这样我就可以使用minicom(或类似的东西)登录并完全访问板上的所有内容.
在搜索网络时,我所能找到的只是关于如何使用手机和类似主题设置拨号网络的指南,但没有关于蓝牙控制台的指南.也许我刚刚尝试过错误的关键字.
我非常感谢任何关于如何做到这一点的暗示.
谢谢,菲利普