【Python_PyQtGraph 学习笔记(二)】基于PySide2和GraphicsLayoutWidget实现动态绘制数据曲线

基于PySide2和GraphicsLayoutWidget实现动态绘制数据曲线

前言

PyQtGraph的例程里基本都是一次性的获取数据并将其绘制为图形,然而在实际开发中大多需要对实时的数据进行图形化展示,这时候就需要对数据进行实时的更新和绘制。
在最近的项目中选用了 Pyside2来写GUI界面,PyQtGraph.GraphicsLayoutWidget来进行图形的绘制,下面简单介绍如何实现该功能。

正文

需求:
设备连接后,开始图形的绘制;设备端口后,图形停止绘制。
思路:
PyQtGraph的绘图数据可以通过setData()这个方法来实现。可以设置一个定时器,每隔一段时间调用setData()方法对图形进行绘制,通过定时器的开关控制是否开始或停止绘制,这样就能够实现数据的实时可视化呈现。

实例详解

创建定时器:

        self.__m_timerUpdateGraph = QTimer()  # 界面更新计时器
        self.__m_timerUpdateGraph.timeout.connect(self.__f_update_plot_data)  # 定时调用__f_update_plot_data函数,在连接串口事件中开启

定时器通过QTimer().timeout.connect()方法,将定时器和自定义函数绑定。

设备连接按钮按下触发定时器:

		self.__m_timerUpdateGraph.start(1000)  # 1000ms调用一次

每隔指定时间执行一次自定义函数,单位是毫秒

创建动态数据:

        self.__m_temCurveLst = []  # 温度曲线列表
        self.__m_humCurveLst = []  # 湿度曲线列表
        self.__m_curvePtr = 0  # 曲线指针

创建曲线对象:

       	self.__m_temCurveLst = [0] * 10  # 温度曲线列表,创建曲线对象时,列表长度不能为1
        self.__m_humCurveLst = [0] * 10  # 湿度曲线列表,创建曲线对象时,列表长度不能为1
        self.ui.temCurve = self.ui.Curve.plot(self.__m_temCurveLst, pen=pg.mkPen('black', width=1), name="温度曲线")
        self.ui.humCurve = self.ui.Curve.plot(self.__m_humCurveLst, pen=pg.mkPen('green', width=1), name="湿度曲线")

具体的曲线创建方法,参数设置可以参考:

https://blog.csdn.net/sallyyellow/article/details/128218692?spm=1001.2014.3001.5501

曲线对象数据更新自定义方法:

# 私有方法:更新plot数据
    def __f_update_plot_data(self):
        """
        function:  更新plot数据函数
              in:  None
             out:  None
          return:  None
          others:  Update Plot Data Function
        """
        self.__m_temCurveLst[self.__m_curvePtr] = self.__m_curvePtr  # 列表元素赋值,这里就随便赋值,可以根据串口获取的数据等实际数据赋值
        self.__m_humCurveLst[self.__m_curvePtr] = 1  # 列表元素赋值,这里赋值了常量1
        self.__m_curvePtr += 1  # 曲线指针+1
        if self.__m_curvePtr >= len(self.__m_temCurveLst):  # 如果指针大小 > 温度数据点列表
            tmp = self.__m_temCurveLst # 获取当前的列表
            self.__m_temCurveLst = [0 for i in range(len(self.__m_temCurveLst) + 10)] # 列表长度+10
            self.__m_temCurveLst[:len(tmp)] = tmp # 将之前获取的列表值 赋值给新列表
            hmp = self.__m_humCurveLst # 获取当前的列表
            self.__m_humCurveLst = [0 for i in range(len(self.__m_humCurveLst) + 10)]
            self.__m_humCurveLst[:len(hmp)] = hmp # 将之前获取的列表值 赋值给新列表
        self.ui.temCurve.setData(self.__m_temCurveLst[:self.__m_curvePtr]) # 重新绘制图形
        self.ui.humCurve.setData(self.__m_humCurveLst[:self.__m_curvePtr]) # 重新绘制图形

实现的效果图:

你可能感兴趣的:(Python学习笔记,#,PyQtGraph学习笔记,python,pyqt,ui)