Pyqt 如何让连续剧在后台和前台都能很好地工作?

Pyqt 如何让连续剧在后台和前台都能很好地工作?,pyqt,pyqt5,qtserialport,Pyqt,Pyqt5,Qtserialport,我有一个串行应用程序,机器人类需要始终接收串行消息,然后做一些事情,演示gui需要交互式机器人并获取机器人。处理读取数据,如果没有获取数据,需要一次又一次地获取,直到获得数据。现在我不知道如何解决这个问题,需要有人给我好主意 从PyQt5.QtWidgets导入* 从PyQt5.QtCore导入* 从PyQt5.QtGui导入* 从PyQt5.QtSerialPort导入* 类机器人(QObject): 定义初始化(自): super()。\uuuu init\uuuuu() self.seri

我有一个串行应用程序,
机器人
类需要始终接收串行消息,然后做一些事情,
演示
gui需要交互式
机器人
并获取
机器人。处理读取数据
,如果没有获取数据,需要一次又一次地获取,直到获得数据。现在我不知道如何解决这个问题,需要有人给我好主意

从PyQt5.QtWidgets导入*
从PyQt5.QtCore导入*
从PyQt5.QtGui导入*
从PyQt5.QtSerialPort导入*
类机器人(QObject):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.serial=QSerialPort()
self.serial.setPortName('COM2')
self.serial.setBaudRate(QSerialPort.Baud115200)
self.serial.readyRead.connect(self.handle\u readData)
self.serial.open(QIODevice.ReadWrite)
#后台消息自动处理
def句柄_读取数据(自身):
data=self.serial.readAll()
self.do_某事(数据)
返回数据
def do_某事(自身、数据):通过
课堂演示(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
布局=QHBoxLayout()
layout.setContentsMargins(0,0,0,0)
self.search\u bn=QPushButton('query',clicked=self.get\u query\u info)
布局。添加拉伸(1)
layout.addWidget(self.search\u bn)
main_layout=QVBoxLayout()
主布局。添加布局(布局)
main_layout.addWidget(QTextEdit('msg'))
self.setLayout(主布局)
#机器人对象
self.robot=robot()
#放弃消息处理,伪代码
def获取查询信息(自检查):
self.robot.serial.write('显示版本')
#如何获取Robot.handle_readData数据,
data=Robot.handle_readData()#需要获取此数据
#如果数据为“无”,则需要反复获取,直到数据包含一些有意义的消息。
做些什么(数据)
self.robot.serial.write('显示系统信息')
#如何获取Robot.handle_readData数据,
data=Robot.handle_readData()#需要获取此数据
#如果数据为“无”,则需要反复获取,直到数据包含一些有意义的消息。
do_someting1(数据)
app=QApplication([])
demo=demo()
demo.show()
app.exec()

Qt被设计为异步工作,而您可能的实现是针对同步逻辑的。这些情况下的解决方案是转换实现,例如在本例中,借助于标志

另一方面,不要在接收信息的地方处理信息,相反,它会发出信号,以便可以在其他地方使用

从枚举导入枚举,自动
从PyQt5.QtCore导入pyqtSignal、pyqtSlot、QIODevice、QObject
从PyQt5.QtWidgets导入(
QApplication,
QDialog,
QHBoxLayout,
QPushButton,
QVBoxLayout,
QTextEdit,
)
从PyQt5.QtSerialPort导入QSerialPort
类机器人(QObject):
dataChanged=pyqtSignal(字节)
定义初始化(自):
super()。\uuuu init\uuuuu()
self.serial=QSerialPort()
self.serial.setPortName(“COM2”)
self.serial.setBaudRate(QSerialPort.Baud115200)
self.serial.readyRead.connect(self.handle\u readData)
self.serial.open(QIODevice.ReadWrite)
self.dataChanged.connect(self.do\u something)
@pyqtSlot()
def句柄_读取数据(自身):
data=self.serial.readAll()
self.dataChanged.emit(数据)
@pyqtSlot(字节)
def do_某事(自身、数据):
通过
类状态(枚举):
非状态=自动()
VersionState=auto()
InfoState=auto()
课堂演示(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
布局=QHBoxLayout()
layout.setContentsMargins(0,0,0,0)
self.search\u bn=QPushButton(“查询”,点击=self.get\u查询\u信息)
布局。添加拉伸(1)
layout.addWidget(self.search\u bn)
主布局=QVBoxLayout(自)
主布局。添加布局(布局)
main_layout.addWidget(QTextEdit(“msg”))
self.current_state=state.NoneState
self.robot=robot()
self.robot.dataChanged.connect(self.process\u数据)
@pyqtSlot()
def获取查询信息(自我):
self.robot.serial.write(b“显示版本”)
self.current_state=state.VersionState
@pyqtSlot(字节)
def过程_数据(自身、数据):
如果self.current_state==state.VersionState:
做些什么(数据)
self.robot.serial.write(b“显示系统信息”)
self.current_state=state.InfoState
elif self.current_state==state.InfoState:
do_someting1(数据)
self.current_state=state.NoneState
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QApplication(sys.argv)
demo=demo()
demo.show()
sys.exit(app.exec_())

非常好的解决方案,它让我久久不能忘怀,我会记在心里的。