构建简单的终端 pyqt4 和 pyserial 如何更新文本浏览器

Posted

技术标签:

【中文标题】构建简单的终端 pyqt4 和 pyserial 如何更新文本浏览器【英文标题】:building simple terminal pyqt4 and pyserial how to update textbrowser 【发布时间】:2016-09-20 17:07:57 【问题描述】:

我遵循了一个关于使用 qt 设计器创建基本 gui 的简单教程,并将其合并到 python 中。然后我制作了一个简单的 python 脚本,它不断地从串口读取换行符并将它们打印到终端。我想将它们结合起来,但恐怕我对 pyqt4 的工作原理或者类本身的理解太缺乏,无法完成如此简单的任务。对于初学者来说,我想要完成的就是连续打印传入的串行数据。我试图将串行打印循环移动到 python 脚本的不同区域,但它会导致窗口挂起。这样做的正确方法是什么? pyqt代码:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(400, 300)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.centralWidget)
        self.verticalLayout.setMargin(11)
        self.verticalLayout.setSpacing(6)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.textBrowser = QtGui.QTextBrowser(self.centralWidget)
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.verticalLayout.addWidget(self.textBrowser)
        self.pushButton = QtGui.QPushButton(self.centralWidget)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralWidget)
        self.menuBar = QtGui.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 21))
        self.menuBar.setObjectName(_fromUtf8("menuBar"))
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtGui.QToolBar(MainWindow)
        self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtGui.QStatusBar(MainWindow)
        self.statusBar.setObjectName(_fromUtf8("statusBar"))
        MainWindow.setStatusBar(self.statusBar)
        self.textBrowser.append("blabla")
        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "Close", None))
        self.textBrowser.append("blabla")


if __name__ == "__main__":
    import sys
    import serial
    ser = serial.Serial()
    ser.baudrate = 115200
    ser.port = 'COM6'
    ser.open()
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    ui.textBrowser.append(str(ser.readline()))
    sys.exit(app.exec_())

序列号:

import serial
ser = serial.Serial()
ser.baudrate = 115200
ser.port = 'COM6'
ser.open()
while True:
    print(ser.readline())   # read a '\n' terminated line

【问题讨论】:

【参考方案1】:

对于有类似问题的任何人。我通过实现计时器并在类中创建新函数找到了解决方案:

self.my_timer = QtCore.QTimer()
        self.my_timer.timeout.connect(self.print_serial)
        self.my_timer.start(10) # milliseconds

    def print_serial(self):
        if ser.in_waiting:
            self.textBrowser.append(str(ser.readline()))

这适用于我的应用程序。

【讨论】:

以上是关于构建简单的终端 pyqt4 和 pyserial 如何更新文本浏览器的主要内容,如果未能解决你的问题,请参考以下文章

仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效

如何让 PySerial 接受 921600 波特率

重启后Pyserial的串行连接问题

PyQt4 - Phonon - Mac 构建问题

在 macOS 上安装 PyQt4 时 C++ 标准库出现问题

运行 Pyserial 时出错