问题描述
我的目标是使用 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())
...