Python -串行通信阻止控制台输出[重复]

7eumitmz  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(112)

此问题已在此处有答案

Background thread with QThread in PyQt(7个回答)
Example of the right way to use QThread in PyQt?(3个答案)
In PyQt, what is the best way to share data between the main window and a thread(1个答案)
2天前关闭。
在我的脚本中,我通过串行连接发送数据。每当在我的脚本中执行某些操作时,控制台中都会显示一个时间戳。当我开始发送数据时,它应该说“发送数据。..”
当它完成的时候
“数据已发送...”
我的脚本从一开始就使用时间戳。但不幸的是,它只是在最后与发送的数据一起输出。意思是“发送数据”..”和“数据已发送。..”同时出现。
我的问题是:为什么在串行通信开始之前打印的时间戳只在之后打印?
下面是一个GUI的小例子。我使用PyQt5。
脚本:

#SCRIPT
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt
import sys
import GUI
import datetime
import serial

ser = serial.Serial(
        port='/dev/serial0',
        baudrate = 57600,
        timeout=1
        )
        
class my_class(QtWidgets.QMainWindow, GUI.Ui_MainWindow):
    def __init__(self, parent=None):
        super(my_class, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.push_button_pressed)

    def push_button_pressed(self):
        self.sendData()
        
    def sendData(self):
        self.Console.append(str(datetime.datetime.now()) + " Send Data...")
        data_to_send = []
        for i in range(10000):
            data_to_send.append(i)
        print(data_to_send)
        ser.write(str(data_to_send).encode('utf-8'))
        self.Console.append(str(datetime.datetime.now()) + " Data sent...")

def main():
    app = QApplication(sys.argv)
    form = my_class()
    form.show()
    app.exec_()
    
    
if __name__ == '__main__':
    main()

GUI:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(238, 191)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(80, 120, 91, 30))
        self.pushButton.setObjectName("pushButton")
        self.Console = QtWidgets.QTextEdit(self.centralwidget)
        self.Console.setGeometry(QtCore.QRect(10, 10, 221, 101))
        self.Console.setObjectName("Console")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
ocebsuys

ocebsuys1#

这是因为sendData()在主GUI线程中执行。当函数运行时,GUI不会更新。您应该在QThread中设置sendData(),并通过信号将输出发送到控制台。

相关问题