pyqt5 动态曲线绘图 面向过程的方式

时间:2024-05-22 15:15:25

在数据处理过程当中,经常需要实时显示某些数据,尤其是在应用软件设计过程中,Qt是一个很好的方式。在这里利用pyqt5展示一个面向过程编程的例子,展示实际工程中如何利用pyQT 绘制动态曲线。

面向过程的编程方法的一般过程如下

#1. 导入包与模块
#2. 创建一个应用程序
#3. 创建窗口以及控件
#4. 进入消息循环

 

按照这个思路进行编程,程序如下图所示

import sys,time
from PyQt5.QtWidgets import QApplication,QMainWindow,QGridLayout
from PyQt5 import QtCore, QtGui, QtWidgets

import numpy as np
from matplotlib.lines import Line2D

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
##################
from PyQt5.QtCore import QTimer


def PrepareSamples(wyz_sam):
    wyz_sam.x = np.arange(-4, 4, 0.02)
    wyz_sam.y = np.arange(-4, 4, 0.02)
    wyz_sam.X, wyz_sam.Y = np.meshgrid(wyz_sam.x, wyz_sam.y)
    wyz_sam.z = np.sin(wyz_sam.x)
    wyz_sam.R = np.sqrt(wyz_sam.X ** 2 + wyz_sam.Y ** 2)
    wyz_sam.Z = np.sin(wyz_sam.R)
    return wyz_sam


def UpdateImgs():
    dt=time.time()-ts
    #print(dt)
    z=np.sin(wyz_samples.x+dt)
    line.set_ydata(z)
    figure_Qt.draw()
    
#2. 创建一个立应用程序
app = QApplication(sys.argv)

#3. 创建窗口与控件
##3.1 创建主窗口,名字为suide
mainwindow  = QMainWindow()
mainwindow.resize(400,400)
##3.2 创建QGroupBox控件,名字为区域
plotarea = QtWidgets.QGroupBox(mainwindow)#创建绘图区域控件,为主窗口的子窗口
plotarea.setGeometry(QtCore.QRect(100, 50, 591, 361))
plotarea.setObjectName("groupBox")


##3.3 创建画板:首先建立matplotlib中的FIgure,然后利用FigureCanvasQTAgg将其转换为窗体对象
####该部分完成Figure_Canves
width=3.9
height=2.7
figure_wyz = Figure(figsize=(width,height),dpi=100)
figure_Qt = FigureCanvas(figure_wyz)
figure_Qt.ax=figure_wyz.add_subplot(111)
#huaban.setParent(quyu)####将Figure 渲染成的QWidget窗体设置为QGroupBox的子窗口

#######改部分完成prepareFIgureCanves

LineFigureLayout = QGridLayout(plotarea)
LineFigureLayout.addWidget(figure_Qt)

figure_Qt.ax.set_xlim(-4, 4)
figure_Qt.ax.set_ylim(-2, 2)

wyz_samples = PrepareSamples(mainwindow)
line = Line2D(wyz_samples.x,wyz_samples.z)
figure_Qt.ax.add_line(line)

#4. 进入消息循环
#此处采用计时器进行循环,按时更新曲线对象,完成动态图形的绘制

timer=QTimer()
timer.start(1)
ts=time.time()
timer.timeout.connect(UpdateImgs)

 

mainwindow.show()

sys.exit(app.exec_())
 

 

程序运行结果为:

pyqt5 动态曲线绘图 面向过程的方式