2016-09-20 91 views
0

我已经遵循了一个简单的教程,使用qt设计器创建一个基本的gui,并将其纳入python。然后我做了一个简单的python脚本,它不断地从串口读取换行符并将它们打印到终端。我想把它们结合起来,但是我担心我对pyqt4的工作原理的理解,或者对于自己的类来说,太缺乏完成这样一个简单的任务。对于初学者,我想要完成的是连续打印输入的串行数据。我试图将串行打印循环移动到python脚本的不同区域,但会导致窗口挂起。什么是正确的方法来做到这一点? 的PyQt代码:建设简单的终端pyqt4和pyserial如何更新文本浏览器

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 

回答

0

对于任何人有类似的问题。我发现通过实现一个计时器,并在班级创建一个新的功能的解决方案:

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())) 

这个工作对我的申请。