我想用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)