栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pyqt5 Qt Designer + PyqtGraph画图显示动态曲线

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pyqt5 Qt Designer + PyqtGraph画图显示动态曲线

PyQt5 Qt Designer 使用PyqtGraph画图显示动态曲线 源码示例下载

传送门

效果图:

导入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/simple
2、打开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】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931818.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号