在数据处理过程当中,经常需要实时显示某些数据,尤其是在应用软件设计过程中,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_())
程序运行结果为: