如何在等待串行反馈时保持PyQt5 UI响应?

时间:2017-08-04 10:42:16

标签: python qt pyqt5 pyserial

我正在开发一个简单的软件,其中串行将反馈信息并在UI上更新。

该软件将在Raspbian Jessie,Python 3.4,PyQt5和Pyserial中运行。 此UI通过Qt Designer绘制并通过pyuic转换。 该软件的目的是监控通过MCU芯片连接到我的Pi的4步电机,串行信息来自该MCU。我没有使用Pi的GPIO,因为他们有其他用途。

我想在串行缓冲区填充信息后立即在屏幕上显示文本。

我曾尝试过以下代码,但它不够好,因为我必须依赖定时器来检查串行读取。一旦串口收到信息,还有另一种更有效的方法可以在屏幕上显示文本吗?

import sys, datetime
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QWidget
#import UI drawn from QtDesigner
from QFrame.Main_btn6 import Ui_MainWindow
import serial


def setupserial(object):    
    com = serial.Serial(port        = "/dev/ttyUSB0",
                        baudrate    = 115200,
                        parity      = serial.PARITY_NONE,
                        stopbits    = serial.STOPBITS_ONE,
                        bytesize    = serial.EIGHTBITS,                                  
                        timeout     = 3) #ms   
    return (com)


class Form_Operation(QtWidgets.QMainWindow):    
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.timer      = QtCore.QTimer(self)
        self.ui         = Ui_MainWindow()
        self.serialcom  = setupserial()
        self.timer.setInterval(10)
        self.timer.timeout.connect(self.hidden)
        self.ui.setupUi(self)        
        self.initUI()    

    def initUI(self):
        self.ui.MainDisplay.setText("Output from Serial comn.")

        Exit = self.ui.Btn_Exit
        Exit.clicked.connect(self.Exit_buttonClicked)

        Clear = self.ui.Btn_Clear
        Clear.clicked.connect(self.Clear_buttonClicked)

    def hidden(self):  
        """
        Get texts from serial
        """
        self.comread = self.com.readline().decode()        
        self.ui.MainDisplay.setText(self.comread)

    def Exit_buttonClicked(self):
        sys.exit()

    def Clear_buttonClicked(self):
        """ 
        Click to clear 
        """
        self.ui.MainDisplay.setText("")            

    def close(self):
        self.timer.stop()
        self.destroy() 

    def show(self):
        self.timer.start()
        self.showFullScreen() 

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    start = Form_Operation()
    start.show()
    sys.exit(app.exec_())

0 个答案:

没有答案