在pyqt5中连续接收串口数据时如何切换按钮

问题描述

我在 pyqt5 中设计了一个 GUI。所有其他功能都运行良好,但是如果我按下按钮(连接),我会从串行端口接收连续数据(它工作正常)但它处于无限循环中,因此稍后我无法切换按钮,即停止连续数据。 代码:部分代码(跳过了一些工作正常的部分)

from PyQt5 import QtCore,QtGui,QtWidgets,QtSerialPort
import traceback,serial

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.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(140,31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setobjectName("pushButton_4")
        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.setCheckable(True)
        self.pushButton.clicked.connect(self.Connect)
        self.pushButton.toggle()
        self.pushButton_2.clicked.connect(self.Send)            

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

    def retranslateUi(self,MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setwindowTitle(_translate("MainWindow","Serial Port"))
        self.pushButton.setText(_translate("MainWindow","Connect"))
        self.label.setText(_translate("MainWindow","Serial Data"))
        self.label_2.setText(_translate("MainWindow","Port "))
        self.label_3.setText(_translate("MainWindow","Status :"))
        self.label_4.setText(_translate("MainWindow","Request"))
        self.pushButton_2.setText(_translate("MainWindow","Send"))
        self.label_5.setText(_translate("MainWindow","Message Log"))
        self.pushButton_4.setText(_translate("MainWindow","Clear"))
        self.pushButton_3.setText(_translate("MainWindow","Save"))
        self.comboBox.setItemText(0,_translate("MainWindow","COM8"))
        self.comboBox.setItemText(1,"COM1"))
        self.comboBox.setItemText(2,"COM2"))
        self.comboBox.setItemText(3,"COM3"))
        self.comboBox.setItemText(4,"COM4"))
        self.comboBox.setItemText(5,"COM5"))
        self.comboBox.setItemText(6,"COM6"))
        self.comboBox.setItemText(7,"COM7"))
        self.comboBox.setItemText(8,"COM9"))
        self.comboBox.setItemText(9,"COM10"))
        self.comboBox.setItemText(10,"COM11"))
        self.comboBox.setItemText(11,"COM12"))
        self.comboBox.setItemText(12,"COM13"))
        self.label_6.setText(_translate("MainWindow","Baudrate"))
        self.comboBox_2.setItemText(0,"9600"))
        self.comboBox_2.setItemText(1,"115200"))


    def Connect(self):
        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'))
                self.textbrowser.setText("Connected")
                self.textbrowser_2.append(serialString.decode('Ascii'))
                self.textbrowser_2.repaint()


                if  self.pushButton.isEnabled():
                    QtCore.QTimer.singleShot(1,self.Connect)
                else:
                            #self.file.close()
                    self.pushButton.toggle()
                    serialPort.close()
    
    def Send(self):
        port=self.comboBox.currentText()
        baudrate=self.comboBox_2.currentText()
        serialPort = serial.Serial(port =port,stopbits=serial.STOPBITS_ONE)

        serialString = ""

        serialPort.write(str.encode(self.lineEdit_2.text()))
        #print(serialString.decode('ascii'))
        self.textbrowser_2.append(self.lineEdit_2.text())
        self.textbrowser_2.repaint()
        self.lineEdit_2.clear()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)