如何在从串口python pyqt接收的文本浏览器pyqt5上附加串行数据

问题描述

我的目标是使用 PyQt5 创建一个具有从串行端口接收数据功能的 GUI。

  • 此数据应打印到 GUI 内的文本浏览器中。
  • 数据应该连续打印在那里。
  • 阅读应该通过按下按钮来切换。

这是代码的 GUI 部分:

class Ui_MainWindow(object):
    def setupUi(self,MainWindow):
        MainWindow.setobjectName("MainWindow")
        MainWindow.resize(800,600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setobjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(540,60,101,61))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setobjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30,-10,221,71))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setobjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30,81,51))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setobjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(160,130,141,81))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_3.setFont(font)
        self.label_3.setobjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(20,180,201,61))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setobjectName("label_4")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(700,240,51))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setobjectName("pushButton_2")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(20,330,251,21))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_5.setFont(font)
        self.label_5.setobjectName("label_5")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(30,651,71))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.lineEdit_2.setFont(font)
        self.lineEdit_2.setobjectName("lineEdit_2")
        self.textbrowser = QtWidgets.QTextbrowser(self.centralwidget)
        self.textbrowser.setGeometry(QtCore.QRect(260,150,381,51))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.textbrowser.setFont(font)
        self.textbrowser.setobjectName("textbrowser")
        self.textbrowser_2 = QtWidgets.QTextbrowser(self.centralwidget)
        self.textbrowser_2.setGeometry(QtCore.QRect(30,371,731,181))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.textbrowser_2.setFont(font)
        self.textbrowser_2.setobjectName("textbrowser_2")
        self.Clear = QtWidgets.QPushButton(self.centralwidget)
        self.Clear.setGeometry(QtCore.QRect(140,31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Clear.setFont(font)
        self.Clear.setobjectName("Clear")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(270,31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setobjectName("pushButton_3")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(100,91,61))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.comboBox.setFont(font)
        self.comboBox.setobjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(250,70,41))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_6.setFont(font)
        self.label_6.setobjectName("label_6")
        self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox_2.setGeometry(QtCore.QRect(360,61))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.comboBox_2.setFont(font)
        self.comboBox_2.setobjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,800,21))
        self.menubar.setobjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setobjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.pushButton.clicked.connect(self.Connect)

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

这是阅读功能

def Connect(self,MainWindow):
    port=self.comboBox.currentText()
    baudrate=self.comboBox_2.currentText()

    serialPort = serial.Serial(port = port,baudrate=baudrate,bytesize=8,timeout=2,stopbits=serial.STOPBITS_ONE)

    serialString = " "                     


    while(1):
        if(serialPort.in_waiting > 0):
            serialString = serialPort.readline()
            print(serialString.decode('ascii'))
            serialPort.write(b"Thank you for sending data \r\n")

解决方法

因此要将任何文本附加到 textBrowser 只需使用以下代码行:

self.textBrowser.append(serialString.decode('ascii')) #Append text to the GUI

  • 但是您在 GUI 中使用了 while 循环。 这会导致 整个 GUI 冻结,您的应用程序将不会响应您的任何 输入。
  • 为了不冻结 GUI,您必须使用线程。

在您的代码中声明:

import Threading
...

   #This should go instaed of the line 140: self.pushButton.clicked.connect(self.Connect)
   self.pushButton.clicked.connect(lambda: Threading.Thread(target = self.Connect).start())

...