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访问系统环境变量的方法
Apr 29 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python读取properties配置文件操作示例
Mar 29 Python
Python 监测文件是否更新的方法
Jun 10 Python
Django如何将URL映射到视图
Jul 29 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
Python3实现二叉树的最大深度
Sep 30 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
pycharm导入源码的具体步骤
Aug 04 Python
Python配置pip国内镜像源的实现
Aug 20 Python
Python时间操作之pytz模块使用详解
Jun 14 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
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python列表切片操作实例总结
2019/02/19 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
详解Django中异步任务之django-celery
2020/11/05 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
最新计算机专业自荐信
2013/10/16 职场文书
记者岗位职责
2014/01/06 职场文书
学校四群教育实施方案
2014/06/12 职场文书
委托书怎样写
2014/08/30 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
个人作风建设总结
2014/10/23 职场文书
工作表扬信范文
2015/01/17 职场文书
公司会议开幕词
2015/01/29 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android