2016-09-20 30 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())) 

這個工作對我的申請。

相關問題