使用pyqt图绘制实时数据时,gui没有响应

时间:2020-09-05 09:22:44

标签: python python-3.x pyqt5 pyqtgraph

我想用pyqt5和pyqtgraph绘制一些来自串行端口的数据。我的绘图功能效果很好,因此可以更新gui中的数据。但是,gui在绘制和更新数据时有很多滞后。例如,当我想按任意按钮时,按钮会在1-2秒后进行交互。我该如何解决这个问题?

以下是我的代码的几行:

收集数据的模块

class Data():
def __init__(self, port):
    self.readout = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    self.packet_number_array = []
    self.pressure_array = []
    self.height_array = []
    self.speed_array = []
    self.temperature_array = []
    self.pitch_array = []
    self.roll_array = []
    self.yaw_array = []
    self.voltage_array = []
    self.gps_lat_array = []
    self.gps_long_array = []

    self.tempData = 0

    try:
        self.sp = serial.Serial(port, 9600)
        self.bufferLock = threading.Lock()
        self.timerData = QtCore.QTimer()
        self.timerData.timeout.connect(self.updateThread)
        self.timerData.start(100)

    except ValueError as e:
        print("Serial port error ...")
        return None

def updateThread(self):
    
    while (self.sp.inWaiting() == 0):
        pass

    self.bufferLock.acquire()

    td = self.sp.readline().decode('UTF-8')[:-2]
    # print(td)
    rbuf = td.split(',')
    
    team_number = int(rbuf[0])
    packet_number = int(rbuf[1])
    time_time = str(rbuf[2])
    pressure = int(rbuf[3])
    height = float(rbuf[4])
    speed = float(rbuf[5])
    temperature = float(rbuf[6])
    voltage = float(rbuf[7])
    gps_lat = float(rbuf[8])
    gps_long = float(rbuf[9])
    gps_alt = float(rbuf[10])
    satellite_state = str(rbuf[11])
    pitch = float(rbuf[12])
    roll = float(rbuf[13])
    yaw = float(rbuf[14])
    spinning_number = int(rbuf[15])
    video_state = str(rbuf[16])

    self.readout = [team_number, packet_number, time_time, pressure, height, speed, temperature, voltage,
                    gps_lat, gps_long, gps_alt, satellite_state, pitch, roll, yaw, spinning_number, video_state]

    # append to graph buffers
    self.packet_number_array = np.append(
        self.packet_number_array, packet_number)
    self.pressure_array = np.append(self.pressure_array, pressure)
    self.height_array = np.append(self.height_array, height)
    self.speed_array = np.append(self.speed_array, speed)
    self.temperature_array = np.append(
    self.temperature_array, temperature)
    self.voltage_array = np.append(self.voltage_array, voltage)
    self.pitch_array = np.append(self.pitch_array, pitch)
    self.roll_array = np.append(self.roll_array, roll)
    self.yaw_array = np.append(self.yaw_array, yaw)
    self.gps_lat_array = np.append(self.gps_lat_array, gps_lat)
    self.gps_long_array = np.append(self.gps_long_array, gps_long)

    # sleep(.4)
        
    self.tempData = packet_number


    self.bufferLock.release()

在gui中更新数据的模块:

    def startGcs(self):

    if dt.getReadout()[1]==0:
        self.msg.setWindowTitle('Hata')
        self.msg.setText('')
        self.msg.setIcon(QtWidgets.QMessageBox.Warning)
        x = self.msg.exec_()
    
    else:
        self.timerWriting = QtCore.QTimer()
        self.timerWriting.timeout.connect(self.writingCsvFunc)
        self.timerWriting.start()

        self.timerPlotting = QtCore.QTimer()
        self.timerPlotting.timeout.connect(self.pltAndSimFunc)
        self.timerPlotting.start()

        self.gui.tahrikButton.setEnabled(True)
        self.gui.tahrikButtonStop.setEnabled(True)
        self.gui.ayrilButton.setEnabled(True)
        self.gui.durdurButton.setEnabled(True)

    def pltAndSimFunc(self):

        [packet_number_array, pressure_array, height_array, speed_array,
        temperature_array, pitch_array, roll_array, yaw_array, voltage_array, gps_lat_array, gps_long_array] = dt.getArrays()
    self.gui.yukseklikGraphCurve.setData(packet_number_array, height_array)
    self.gui.sicaklikGraphCurve.setData(
        packet_number_array, temperature_array)
    self.gui.hizGraphCurve.setData(packet_number_array, speed_array)
    self.gui.basincGraphCurve.setData(packet_number_array, pressure_array)
    self.gui.gerilimGraphCurve.setData(packet_number_array, voltage_array)
    self.gui.gpsGraphCurve.setData(gps_long_array, gps_lat_array)

0 个答案:

没有答案