传送门
效果图:
导入pyqt5库:
pip install PyQt5==5.15.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyqt5-plugins==5.15.4.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyQt5-Qt5==5.15.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyQt5-sip==12.9.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyQt5-stubs==5.15.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyqt5-tools==5.15.4.3.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install python-dotenv==0.20.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install qt5-applications==5.15.2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install qt5-tools==5.15.2.1.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy==1.21.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
三、使用PyqtGraph
1、导入库
pip install pyqtgraph -i https://pypi.tuna.tsinghua.edu.cn/simple2、打开Qt Designer
创建一个Main Windows:
保存,命名为dym_plot_graph.ui
3、添加按钮控件添加一个按钮控件pushButton,在右侧objectName命名为btn_start
保存。
4、添加Vertical Layout垂直框用来显示graph图形,在右侧objectName命名为plot_view:
保存。
5、使用pyuic5.exe把ui转py使用pyuic5.exe把dym_plot_graph.ui转dym_plot_graph.py:
转换后,dym_plot_graph.py代码为:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'dym_plot_graph.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.btn_start = QtWidgets.QPushButton(self.centralwidget)
self.btn_start.setGeometry(QtCore.QRect(40, 20, 93, 28))
self.btn_start.setObjectName("btn_start")
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(39, 69, 741, 321))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.plot_view = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.plot_view.setContentsMargins(0, 0, 0, 0)
self.plot_view.setObjectName("plot_view")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.btn_start.setText(_translate("MainWindow", "开始"))
6、创建一个dym_plot_graph_main.py
在dym_plot_graph.py同级目录下创建dym_plot_graph_main.py,用来启动界面,代码如下:
# !/usr/bin/python
# -*- coding: utf-8 -*-
"""
@contact: 微信 1257309054
@file: dym_plot_graph_main.py
@time: 2022/5/26 11:41
@author: LDC
"""
# !/usr/bin/python
# -*- coding: utf-8 -*-
import json
import numpy as np
import pyqtgraph as pg
import time
import sys
from PyQt5.Qt import *
from dym_plot_graph import Ui_MainWindow
from PyQt5.QtChart import QChart, QValueAxis, QChartView, QSplineSeries
class Window(QMainWindow, Ui_MainWindow):
def __init__(self, app):
super(QMainWindow, self).__init__()
self.app = app
self.setup_ui() # 渲染画布
self.update_data_thread = UpdateDataThread() # 创建更新波形数据线程
self.connect_signals() # 绑定触发事件
def setup_ui(self):
self.setupUi(self)
self.x_range = np.arange(128)
# 加载波形
self.set_graph_ui() # 设置绘图窗口
self.plot_show(Sin().get_data())
def set_graph_ui(self):
# pg.setConfigOption('background', 'w')
pg.setConfigOptions(antialias=True, background='w') # pyqtgraph全局变量设置函数,antialias=True开启曲线抗锯齿
win1 = pg.GraphicsLayoutWidget() # 创建pg layout,可实现数据界面布局自动管理
# pg绘图窗口可以作为一个widget添加到GUI中的graph_layout,当然也可以添加到Qt其他所有的容器中
self.plot_view.addWidget(win1)
self.dym_plot_view = win1.addPlot(title="动态波形") # 添加第一个绘图窗口
self.dym_plot_view.setLabel('left', text='强度', color='#000000') # y轴设置函数
self.dym_plot_view.showGrid(x=True, y=True) # 栅格设置函数
self.dym_plot_view.setLogMode(x=False, y=False) # False代表线性坐标轴,True代表对数坐标轴
self.dym_plot_view.setLabel('bottom', text='时间', units='s') # x轴设置函数
# p1.addLegend() # 可选择是否添加legend
# self.dym_plot_view.setYRange(0, 20)
self.dym_plot_view.setLimits(xMin=0, xMax=1024, yMin=-20, yMax=20)
# ax = self.dym_plot_view.getAxis('bottom') # 设置x轴间隔
# dx = [(value, str(value)) for value in range(128)]
# ax.setTicks([dx, []])
def plot_show(self, data):
# 显示波形
y_data = np.array(data)
self.dym_plot_view.plot(self.x_range, y_data, pen='b', name='动态波形', clear=True) # pen画笔颜色为蓝色
def connect_signals(self):
# 绑定触发事件
self.btn_start.clicked.connect(self.btn_start_clicked)
self.update_data_thread._signal_update.connect(self.update_data_thread_slot) # 绑定回调事件
def btn_start_clicked(self):
# 开启按钮
self.update_data_thread.start()
def update_data_thread_slot(self, data):
# 线程回调函数
data = json.loads(data)
self.plot_show(data['sin_data'])
# 使用线程不断更新波形数据
class UpdateDataThread(QThread):
_signal_update = pyqtSignal(str) # 信号
def __init__(self, parent=None):
super(UpdateDataThread, self).__init__(parent)
self.qmut = QMutex()
self.is_exit = False
self.x_range = 128
self.sin = Sin()
def run(self):
while True:
self.qmut.lock()
if self.is_exit:
break
self.qmut.unlock()
self._signal_update.emit(json.dumps({'sin_data': self.sin.get_data()})) # 发送信号给槽函数
time.sleep(1)
self.qmut.unlock()
class Sin():
# 创建一个正弦波数据
def __init__(self, pha=0):
self.pha = pha # 初始相位
self.x_data = np.arange(128)
self.ts = time.time()
def get_data(self):
dt = time.time() - self.ts
z_data = 10 * np.sin(self.x_data + dt * 100) # 准备动态数据
return z_data.tolist()
def main():
app = QApplication(sys.argv)
mywindow = Window(app)
mywindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
运行dym_plot_graph_main.py后,效果图如下:
传送门
后记【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~



