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 greenlet实现原理和使用示例
Sep 24 Python
Python中装饰器的一个妙用
Feb 08 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
使用Python神器对付12306变态验证码
Jan 05 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python I/O与进程的详细讲解
Mar 08 Python
python3的print()函数的用法图文讲解
Jul 16 Python
python3获取url文件大小示例代码
Sep 18 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 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
Terran历史背景
2020/03/14 星际争霸
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
javascript 回调函数详解
2014/11/11 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
javascript数据类型详解
2017/02/07 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
python概率计算器实例分析
2015/03/25 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
Java基础面试题
2014/07/19 面试题
债务授权委托书范本
2014/10/17 职场文书
感恩教育主题班会
2015/08/12 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书