Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具

news2024/12/28 4:39:54

今天是实战篇章,我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。

使用的开发工具Qt Designer来开发UI界面。

f9a9c605037261d87e024fd242dde084.png十分便捷。使用起来也算比较的简单了,虽然也存在不少的BUG。

b91274b8cb1811e42a2ad8859bbc1af5.png

对所需要的控件进行拖拽式,就OK。后续会出一个简单的视频录制。


第二步,就是先将实时读取代码拟定出来。正确运行了,我们在往UI上套。

使用Pyside6,简单的操作一波。windows上所需要用到的获取CPU数据的工具库是psutil,需要第三方下载。


第三步,确定自己需要使用的Pyside6相关的模块有哪些。

不一定一下子全部知道,最起码要有一个范围的认知,知道大致需要哪些。

PySide6.QtCore 中 Qt, QThread, Signal

PySide6.QtGui 中 QPainter

PySide6.QtWidgets 中 QApplication, QMainWindow, QVBoxLayout, QWidget

PySide6.QtCharts 中 QChartView, QLineSeries, QValueAxis


绘图的关键就是QtCharts

关于QtCharts的不太核心的核心代码如下:

# 创建一个图表视图
        self.chart_view = QChartView()
        self.chart_view.setRenderHint(QPainter.Antialiasing)

        # 创建一个折线图
        self.series = QLineSeries()
        self.series.setName("CPU使用率折线图")
        self.chart_view.chart().addSeries(self.series)

        # 创建一个轴
        self.axis_x = QValueAxis()
        self.axis_x.setRange(0, 50)
        self.axis_x.setLabelFormat("%d")
        self.axis_x.setTitleText("Time")

        self.axis_y = QValueAxis()
        self.axis_y.setRange(0, 100)
        self.axis_y.setLabelFormat("%d%%")
        self.axis_y.setTitleText("Usage")

        # 添加轴到图表
        self.chart_view.chart().addAxis(self.axis_x, Qt.AlignBottom)
        self.chart_view.chart().addAxis(self.axis_y, Qt.AlignLeft)
        self.series.attachAxis(self.axis_x)
        self.series.attachAxis(self.axis_y)

有了上述,基本上就可以渲染出一张图了,那么接下来就是数据来源了,从哪来,怎么来,怎么处理。

数据来源主要通过列表的形式传递。所以,我们定义一个列表来存储值。

# 初始化CPU使用率数据列表
self.cpu_usage_data = []

最后,那就是核心的玩意了,传递值并让它显示出来。

# 将数据添加到CPU使用率数据列表中
        self.cpu_usage_data.append(cpu_usage)

        # 只保留最近50个数据点
        self.cpu_usage_data = self.cpu_usage_data[-50:]

        # 清除折线图数据
        self.series.clear()

        # 添加最新的数据点到折线图
        for i, value in enumerate(self.cpu_usage_data):
            self.series.append(i, value)

        # 更新轴的范围
        self.axis_x.setRange(0, len(self.cpu_usage_data) - 1)
        self.axis_y.setRange(0, max(self.cpu_usage_data))

        # 更新图表视图
        self.chart_view.update()

将数据会知道折线图中,主要还是通过循环的方式将值添加到QLineSeries中。

最后绘制的效果是这样的:

6ecd551148900494cda5cda03e30130b.png

我们需要做一点点修改。加上开始停止以及重置/清除的操作。如图:

30411d8edabbd06a39d489c60dd2336c.png

使用Qt Desgner绘制起来一分钟不需要。写代码要写5-10min。

代码中我们使用了线程(非Python的threading模块,而是Pyside6的Qthread模块。)

主要用来一直用来获取数据,以及自定义型号的。自定义信号用来发送暂停开始结束以及over线程的信号。如下:

class CPUMonitorThread(QThread):
    cpu_data_updated = Signal(float)
    stop_requested = Signal()

    def __init__(self):
        super(CPUMonitorThread, self).__init__()
        self.paused = False
        self.should_stop = False  # 新增标志位

    def run(self):
        while not self.should_stop:  # 检查标志位
            if not self.paused:
                cpu_usage = psutil.cpu_percent()
                self.cpu_data_updated.emit(cpu_usage)
                self.msleep(1000)
        self.finished.emit()  # 发出线程完成的信号

    def pause(self):
        self.paused = True

    def resume(self):
        self.paused = False

    def stop(self):  # 新增停止方法
        self.should_stop = True
        self.quit()

三个按钮的信号机制

def clicked(self):
        self.ui.pushButton.clicked.connect(self.Chart)
        self.ui.pushButton_3.clicked.connect(self.clear_computer_info)
        self.ui.pushButton_2.clicked.connect(self.start_or_pause)

清除数据的部分的代码。主要还是要把列表中的数据给清理了。不然数据会一直存在。

def clear_computer_info(self):
        # 清空折线图数据和CPU使用率数据列表
        if self.series:
            self.series.clear()
            self.cpu_usage_data.clear()
            self.axis_y = None
            self.chart_view.update()

最后源代码地址在: https://gitee.com/qinganan_admin/Pyside6_Information/blob/master/%E6%A1%88%E4%BE%8B/%E7%9B%91%E6%B5%8B%E7%94%B5%E8%84%91CPU.py

b站链接地址: 【Pyside6-QtCharts+psutil自制一个监测系统CPU小工具-哔哩哔哩】 https://b23.tv/JAWn3f1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何看待低级爬虫与高级爬虫?

爬虫之所以分为高级和低级,主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因: 功能和复杂性:高级爬虫通常提供更多功能和扩展性,包括处理复杂页面结构、模拟用户操作、解析和清洗数据等。它们解决了开发者…

死神来了 | 印度火车,能靠点谱吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 阿福 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 6月初,印度三列火车先后相撞,造成288人死亡、1175人受伤,被称为印度本世…

基于Echarts2.X的地图数据可视化指南

目录 前言 一、关于Echarts版本 1、为什么用Echarts2.2.7 2、文件目录说明 二、地图数据可视化 1、新建map.html 2、Echarts图表初始化 3、参数设置 三、源码展示分析 1、初始化阶段 2、timelineOption.js模拟数据 总结 前言 在前面的博文(数据会说话-从我国…

ebpf执行报错no BTF found for kernel

一、现象描述 采用cilium epbf框架开发的ebpf程序无法在系统上正常运行。 curtiscurtis-desktop:~$ cd work/ curtiscurtis-desktop:~/work$ ls kmodule vfs_write_moitor curtiscurtis-desktop:~/work$ curtiscurtis-desktop:~/work$ sudo ./vfs_write_moitor -filename/mn…

第九十天学习记录:C++核心:函数提高

函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的。 语法:返回值类型 函数名 (参数默认值){} 问:C语言可以在函数的形参赋默认值吗? 答: 在C语言中&#xf…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三,小结 抖音小游戏是一种基于抖音平台开发的小型游戏,与传统的 APP 不…

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地…

哪个爬虫库用的最多?

在Python中,最常用的爬虫库是requests和BeautifulSoup。requests库用于发送HTTP请求和处理响应,而BeautifulSoup库用于解析HTML文档。这两个库通常结合使用,用于爬取网页内容并提取所需的数据。其他常用的爬虫库还包括Scrapy、Selenium等。 常…

我的创作纪念日(256)

目录 机缘 收获 日常 成就 憧憬 机缘 要说为什么我会选择IT这条路,我觉得是因为从小对电脑的兴趣,从小学2年级开始的电脑生涯,但是那时候也只是玩电脑游戏,而由于我接触电脑较早的缘故,开始有许多的朋友遇到问题…

vue+heatmapjs-vue实现热力图,点击/滑动可以监听并更新

实现效果如下: 点击的次数或者滑动越多,区域的颜色越深 1.下载最新版热力图插件 npm install heatmapjs-vue 2.main.js中全局引用 注意!!!只能全局引用,不能局部引用,局部引用就报错显示不出…

「2024」预备研究生mem-形式逻辑强化:入选名额

一、入选名额 从后往前推 二、课后题

第3章-数组

1. 数组的概述 数组(Array), 是多个相同类型数据按一定顺序排列 的集合, 并使用一个名字命名, 并通过编号的方式 对这些数据进行统一管理数组的常见概念 数组名下标(或索引)元素数组的长度 数组本身是引用数据类型, 而数组中的元…

spring boot admin服务监控报错

使用spring boot admin监控服务启动出现报错:adminHandlerMapping对象创建失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with name adminHandlerMappingdefined in class path resource [de/codecentric/boot/admin/server…

C++Qt 入门

目录 Qt 是什么 Qt 与 Qt Creator 的关系 暗黑主题音乐播放器界面 UI 设计。 简约的视频界面设计。 炫酷车载音乐 APP 主界面开发。 Qt/C与 QML 如何选择 Qt 版本 Linux 下安装 Qt 配置中文输入法 Qt Creator 简单使用 第一个 Qt 程序 新建一个项目 ​编辑 项目文…

Java JDBC

目录 JDBC定义 为什么需要JDBC JDBC的工作原理 JDBC API JDBC编程模板 JDBC编程步骤 JDBC实战 1.JDBC定义 Java连接数据库的一种能力或是技术 2.为什么需要JDBC 总结:利用JDBC才可以使服务器端和数据库进行数据的传递和交互 场景1: 客户端&am…

chatgpt赋能python:Python选择排序算法图解

Python选择排序算法图解 选择排序是计算机科学中经典的排序算法之一,它的原理是从待排序的数据中选择最小的元素然后排在最前面,接着从剩下未排序的数据中继续这个过程,直到所有的数据都排好序。 在本篇文章中,我将深入探讨Pyth…

微服务架构之网关详解

前言 由于互联网的高速发展,网络数据请求数激增,使得服务器承受的压力越来越大。在早期的系统架构中,为减轻单台服务器的压力,通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Django DRF - 【Token】认证基本使用

一. 前言 Django Rest Framework Token是Django Rest Framework中的一个扩展,用于实现用户认证和授权。它为每个用户生成一个唯一的Token,并将其存储在数据库中。在用户进行API请求时,用户需要在请求的HTTP Header中包含Token,这…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展,越来越多的行业开始尝试将VR技术应用到实际场景中,以提供更加真实的体验。其中,机械伤害事故VR警示教育系统的出现,为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上,…

odoo16 中ondelete的用法

odoo 中的many2one类型字段有 ondelete设置,对应数据表中关系处理 a fields.Many2one(‘b’, string‘b’, ondelete‘set null’) 则当对模型b进行delete操作时,会引发如下操作 set null: 当b中删除记录时,modelA中相关记录的anull casc…