PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形


Posted in Python onMay 13, 2019

在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示,比如:股票的实时行情、仪器设备的实时状态等,这时候就需要对数据进行实时的更新和绘制。

今天我们就来介绍一下在PyQtGraph中根据实时数据更新绘制图形。

今天的例子我们通过编写一个电脑CPU实时使用率助手来讲解。

一、通过Python获取实时的CPU信息

在Windows操作系统的电脑上,我们通过“任务管理器”可以很方便地查看到自己电脑CPU实时的使用情况,并且CPU的占用率还会通过一个实时的图形区域显示出来,如下图所示:

PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

通过实时变化的CPU利用率图形,我们可以清晰地看到CPU使用情况的变化。在Python中,我们也能很方便的获取到计算机CPU的实时使用率。

# coding:utf-8
# @文件: 1.py
# @创建者:州的先生
# #日期:2019/5/12
# 博客地址:https://zmister.com
 
import psutil
cpu = "CPU:%0.2f" % psutil.cpu_percent(interval=1) + "%"
print(cpu)

通过运行上述代码,我们就能获取到此时电脑CPU的使用率。通过将其改进一下,加入循环和时间间隔,我们就可以持续获得当前电脑CPU的使用率,如下代码所示:

# coding:utf-8
# @文件: 1.py
# @创建者:州的先生
# #日期:2019/5/12
# 博客地址:zmister.com
 
import psutil
import time
 
 
def get_cpu_info():
  cpu = "CPU:%0.2f" % psutil.cpu_percent(interval=1) + "%"
  return cpu
 
 
def main():
  while True:
    info = get_cpu_info()
    print(info)
    time.sleep(1)
 
 
if __name__ == "__main__":
  main()

运行上述代码,我们将每隔1秒获取到实时的CPU使用率数据,这将是我们图形界面程序的数据来源。

二、使用PyQt5创建一个图形界面

有了数据来源之后,我们来创建一个图形界面,这个图形界面由一个Widget包裹着一个Plotwidget,图形界面的核心就是一个ptqtgraph的图形部件。其代码如下所示:

# coding:utf-8
# @文件: 1.py
# @创建者:州的先生
# #日期:2019/5/12
# 博客地址:zmister.com
 
from PyQt5 import QtWidgets,QtCore,QtGui
import tushare as ts
import pyqtgraph as pg
import sys
import datetime
import traceback
import numpy as np
 
class MainUi(QtWidgets.QMainWindow):
  def __init__(self):
    super().__init__()
    self.setWindowTitle("CPU使用率监控 - 州的先生https://zmister.com")
    self.main_widget = QtWidgets.QWidget() # 创建一个主部件
    self.main_layout = QtWidgets.QGridLayout() # 创建一个网格布局
    self.main_widget.setLayout(self.main_layout) # 设置主部件的布局为网格
    self.setCentralWidget(self.main_widget) # 设置窗口默认部件
 
    self.plot_widget = QtWidgets.QWidget() # 实例化一个widget部件作为K线图部件
    self.plot_layout = QtWidgets.QGridLayout() # 实例化一个网格布局层
    self.plot_widget.setLayout(self.plot_layout) # 设置线图部件的布局层
    self.plot_plt = pg.PlotWidget() # 实例化一个绘图部件
    self.plot_plt.showGrid(x=True,y=True) # 显示图形网格
    self.plot_layout.addWidget(self.plot_plt) # 添加绘图部件到线图部件的网格布局层
    # 将上述部件添加到布局层中
    self.main_layout.addWidget(self.plot_widget, 1, 0, 3, 3)
 
    self.setCentralWidget(self.main_widget)
 
def main():
  app = QtWidgets.QApplication(sys.argv)
  gui = MainUi()
  gui.show()
  sys.exit(app.exec_())
 
 
if __name__ == '__main__':
  main()

运行上述代码,我们将会得到一个如下图所示的图形界面:

PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

我们的CPU使用率数据将会通过图形界面中间的画布部件显示出来。

三、在PyQtGraph中实时显示CPU数据

创建好了基础的图形界面之后,我们就可以实时获取电脑CPU的使用率然后将其绘制在图形界面上了。

在之前的文章中,我们知道pyqtgraph的绘图数据主要是通过setData()这个方法来转化为图形。我们可以设置一个定时器,每隔一个时间重新调用setData()方法对图形数据进行设置,就能够实现实时的数据可视化呈现。下面我们通过代码演示一下:

from PyQt5 import QtWidgets,QtCore,QtGui
import pyqtgraph as pg
import sys
import traceback
import psutil
 
class MainUi(QtWidgets.QMainWindow):
  def __init__(self):
    super().__init__()
    self.setWindowTitle("CPU使用率监控 - 州的先生https://zmister.com")
    self.main_widget = QtWidgets.QWidget() # 创建一个主部件
    self.main_layout = QtWidgets.QGridLayout() # 创建一个网格布局
    self.main_widget.setLayout(self.main_layout) # 设置主部件的布局为网格
    self.setCentralWidget(self.main_widget) # 设置窗口默认部件
 
    self.plot_widget = QtWidgets.QWidget() # 实例化一个widget部件作为K线图部件
    self.plot_layout = QtWidgets.QGridLayout() # 实例化一个网格布局层
    self.plot_widget.setLayout(self.plot_layout) # 设置K线图部件的布局层
    self.plot_plt = pg.PlotWidget() # 实例化一个绘图部件
    self.plot_plt.showGrid(x=True,y=True) # 显示图形网格
    self.plot_layout.addWidget(self.plot_plt) # 添加绘图部件到K线图部件的网格布局层
    # 将上述部件添加到布局层中
    self.main_layout.addWidget(self.plot_widget, 1, 0, 3, 3)
 
    self.setCentralWidget(self.main_widget)
    self.plot_plt.setYRange(max=100,min=0)
    self.data_list = []
    self.timer_start()
 
  # 启动定时器 时间间隔秒
  def timer_start(self):
    self.timer = QtCore.QTimer(self)
    self.timer.timeout.connect(self.get_cpu_info)
    self.timer.start(1000)
 
  # 获取CPU使用率
  def get_cpu_info(self):
    try:
      cpu = "%0.2f" % psutil.cpu_percent(interval=1)
      self.data_list.append(float(cpu))
      print(float(cpu))
      self.plot_plt.plot().setData(self.data_list,pen='g')
    except Exception as e:
      print(traceback.print_exc())
 
def main():
  app = QtWidgets.QApplication(sys.argv)
  gui = MainUi()
  gui.show()
  sys.exit(app.exec_())
 
 
if __name__ == '__main__':
  main()

在上述代码中,我们定义了一个1秒钟的计时器,然后定义了一个数据列表data_list,获取到的cpu使用率都将添加到这个列表中,然后作为图形数据传递给pyqtgraph。

运行上述代码,我们可以得到如下动图所示的实时更新图形界面,每一秒获取到的CPU使用率数据都实时绘制为了线条:

PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

由于所有的操作都是在主线程上进行的,会导致图形界面有些许的卡顿,更加理想的做法是创建一个子线程来生成和绘制图形,在此就不作额外的演示了,大家可以自己尝试一下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python抓取网页中的图片示例
Feb 28 Python
用python读写excel的方法
Nov 18 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
Python命名空间的本质和加载顺序
Dec 17 Python
python如何实现异步调用函数执行
Jul 08 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
django 多数据库及分库实现方式
Apr 01 Python
Python实现查找数据库最接近的数据
Jun 08 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 Python
Python实现插入排序和选择排序的方法
May 12 #Python
Python中将两个或多个list合成一个list的方法小结
May 12 #Python
python实现海螺图片的方法示例
May 12 #Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 #Python
python的turtle库使用详解
May 10 #Python
详解Python sys.argv使用方法
May 10 #Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 #Python
You might like
php strrpos()与strripos()函数
2013/08/31 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
PHP与以太坊交互详解
2018/08/24 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
SVG描边动画
2017/02/23 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
学Python 3的理由和必要性
2019/11/19 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
PageFactory设计模式基于python实现
2020/04/14 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
证婚人经典证婚词
2014/01/09 职场文书
韩国商务邀请函
2014/01/14 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
2019新员工心得体会
2019/06/25 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python