构建简单的终端 pyqt4 和 pyserial 如何更新 textbrowser
building simple terminal pyqt4 and pyserial how to update textbrowser
我遵循了使用 qt 设计器创建基本图形用户界面的简单教程,并将其合并到 python 中。然后我做了一个简单的 python 脚本,它只是不断地从串行端口读取换行符并将它们打印到终端。我想将它们结合起来,但恐怕我对 pyqt4 的工作原理或 类 本身的理解太缺乏,无法完成如此简单的任务。对于初学者,我想要完成的就是连续打印传入的串行数据。我试图将串行打印循环移动到 python 脚本的不同区域,但它导致 window 挂起。这样做的正确方法是什么?
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
对于有类似问题的任何人。我通过实现计时器并在 class:
中创建一个新函数找到了解决方案
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()))
这适用于我的申请。
我遵循了使用 qt 设计器创建基本图形用户界面的简单教程,并将其合并到 python 中。然后我做了一个简单的 python 脚本,它只是不断地从串行端口读取换行符并将它们打印到终端。我想将它们结合起来,但恐怕我对 pyqt4 的工作原理或 类 本身的理解太缺乏,无法完成如此简单的任务。对于初学者,我想要完成的就是连续打印传入的串行数据。我试图将串行打印循环移动到 python 脚本的不同区域,但它导致 window 挂起。这样做的正确方法是什么? 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
对于有类似问题的任何人。我通过实现计时器并在 class:
中创建一个新函数找到了解决方案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()))
这适用于我的申请。