Python图形界面开发——系统资源监视器System-Monitor

news2024/11/16 9:19:56

Python图形界面程序怎么开发呢?很多人推荐python自带的tkinter自带库,还有pyqt这个这种拖拽式界面开发方案,但是他们开发界面比较难定制界面样式。现在web前端这么多框架用来开发python的图形界面其实不是很好?下面这么案例就是用electron作为python的图形界面,通过node-pyrunner实现与python交互,把web前端繁荣的生态融合进python的生态,引入electron意味着可以用bootstrap或者vuejs、react等等优秀的前端框架进行界面开发,后端用python丰富的第三方库进行开发。

系统资源监视器system-monitor是基于Electron创建并使用node-pyrunner执行python的应用,实现了CPU、内存等系统资源使用的监视。Python部分主要用第三方库psutil获取系统CPU和内存等硬件使用情况,最终在Electron中通过echarts呈现数据。

在这里插入图片描述
在这里插入图片描述

项目目录

system-monitor:.
│  echarts.min.js	#echarts图表
│  index.html		#electron页面
│  index.js			#node入口文件
│  package.json		#npm项目配置文件
│  python3.dll		#python解释器动态库
│  python310.dll	#python解释器动态库
│  README.md
│  renderer.js		#index.html页面JS脚本文件
│  styles.css
│
├─pyscript
│  │  app.py	#python脚本
│  │
│  └─venv
│      └─Lib
│          └─site-packages	#python虚拟环境第三方pip包目录
│
└─python	#python解释器目录

克隆项目

你需要Git工具和Node.js (包含npm)克隆到本地才能运行,执行以下命令:

# 克隆仓库
git clone https://github.com/supercoderlee/system-monitor.git
# 进入目录
cd system-monitor
# 安装依赖
npm install

安装psutil模块

安装python在当前项目下执行命令创建虚拟环境

python -m venv pyscript/venv

使用虚拟环境的目的是方便打包发布应用时包含python模块。

激活虚拟环境

pyscript/venv/Scripts/activate

安装psutil模块

pip install psutil

启动应用

npm start

Python代码

python部分时启动两个线程每秒读取CPU和内存占用信息,然后再python中调用JavaScript的函数实现动态更新echarts图表数据。

app.py

import nodepyrunner
import threading
import time
import psutil
import winreg
import json

# 获取CPU信息
def cpu_info():
    # 注册表读取CPU名称
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\CentralProcessor\0")
    cpu_name = winreg.QueryValueEx(key, "ProcessorNameString")
    key.Close()
    # CPU使用信息
    data = dict(
        cpu_name=cpu_name[0],
        cpu_avg=psutil.cpu_percent(interval=0, percpu=False),  # cpu平均使用率
        per_cpu_avg=psutil.cpu_percent(interval=0, percpu=True),  # 每个cpu使用率
        cpu_core=psutil.cpu_count(False),  # cpu物理核心数量
        cpu_logic=psutil.cpu_count(True)  # cpu逻辑核心数量
    )
    return data

# CPU监视线程
def cpu_monitor():
    while(True):
        time.sleep(1)
        data = cpu_info()
        j_str = json.dumps(data)
        #调用JS函数更新图表数据
        nodepyrunner.callJs(target='UpdataCPU', args=[j_str])  

def start():
    t_cpu = threading.Thread(target=cpu_monitor, args=())
    t_cpu.start()

JavaScript代码

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'">
    <link href="./styles.css" rel="stylesheet">
    <!-- 引用echarts -->
    <script src="echarts.min.js"></script>
    <title>系统资源监视器 - Power by Node-PyRunner</title>
  </head>
  <body>
    <!-- echarts渲染标签 -->
    <div id="cpu-percent-chart" style="width: 100%;height:260px;"></div>
    <!-- 加载renderer.js -->
    <script src="./renderer.js"></script>
  </body>
</html>

renderer.js

/
// echarts部分
/

/* 添加初始数据 */
let cpuData = [];
let xAxisData = [];
for (let index = 60; index > -1; index--) {
    let str = (index == 60) ? '60秒' : (index == 0) ? '0' : '';
    xAxisData.push(str); //X轴只添加第一个和最后一个项目
    cpuData.push(0); //添加60个0到数组,因为监视CPU图表从右侧更新数据
}

/* CPU */
var cpuPercentChart = echarts.init(document.getElementById('cpu-percent-chart'));
cpuPercentOption = {
    title: {
        text: 'CPU'
    },
    grid: {
        left: '20',
        right: '1%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        type: 'category',
        boundaryGap: false,
        data: xAxisData
    },
    yAxis: {
        name: '使用率',
        type: 'value',
        // position: 'right'
    },
    series: [
        {
            name: 'Fake Data',
            type: 'line',
            symbol: 'none',
            sampling: 'lttb',
            itemStyle: {
                color: 'rgb(95,174,227)'
            },
            areaStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    {
                        offset: 0,
                        color: 'rgb(255, 158, 68)'
                    },
                    {
                        offset: 1,
                        color: 'rgb(255, 70, 131)'
                    }
                ])
            },
            data: cpuData,
            type: 'line',
            areaStyle: {}
        }
    ]
};
cpuPercentChart.setOption(cpuPercentOption);

/* 监听改变窗体尺寸事件自适应图表 */
window.addEventListener('resize', function () {
    cpuPercentChart.resize();
});

/
// node-pyrunner执行python部分
/

const pyrunner = require('node-pyrunner')
pyrunner.config['module_search_paths'].push('./pyscript');
pyrunner.init();
let appModule = pyrunner.loadModule('app');
appModule.callSync('start', []); //启动python监视线程

/* python调用函数更新CPU */
UpdataCPU = (jsonStr) => {
    let obj = JSON.parse(jsonStr);
    cpuPercentOption['title']['text'] = `CPU ${obj.cpu_name}`; // 更新标题
    cpuPercentOption['yAxis']['name'] = `使用率 ${obj.cpu_avg}% `; // 更新Y轴名称
    // 更新数据
    let chartdata = cpuPercentOption['series'][0]['data'];
    chartdata.push(obj.cpu_avg);
    chartdata.shift();
    cpuPercentChart.setOption(cpuPercentOption);
}

学习资料

  • electronjs.org/docs - Electron所有文档
  • Electron Fiddle - 测试Electron的实验。
  • node-pyrunner/docs - Node-PyRunner文档

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

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

相关文章

Python爬虫 | 一文解决文章付费限制问题

本文概要 本篇文章主要介绍利用Python爬虫爬取付费文章&#xff0c;适合练习爬虫基础同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&…

项目内训(2023.5.6)

目录 Nacos是什么&#xff1f; 领域模型是什么&#xff1f; domain模块一般是干什么的&#xff1f; 在小乌龟中合并其他分支的作用是什么&#xff1f; nacos的配置文件 服务集群、服务提供、服务更加灵活庞大、消费服务、访问比较麻烦&#xff0c;A和B服务一起访问 系统结…

Qt5.9学习笔记-事件(四)Qt5.9中常见事件

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

5月1日 9H45min|5月2日 8H20min+30min|时间轴复盘

8:00 起床 8:00-8:30 洗漱吃饭 8:30-10:40 temporary pools阅读真题精读 (真的很慢了 不知道什么原因 感觉也没有彻底完全弄懂)【2h+10min】 10:40-11:10 午餐+酸奶(423+174KJ) 11:20-12:30 三篇阅读【1h+10min】 13:10-14:50 健身 14:50-15:45诵默写list…

【Stable Diffusion】ControlNet基本教程(四)

本文概要 接上篇【Stable Diffusion】ControlNet基本教程&#xff08;三&#xff09;&#xff0c;本篇再介绍两个ControlNet常见的基本用法&#xff1a;控制人物动作和建筑/室内生成。让人物摆出特定的动作&#xff0c;这是ControlNet最神级的操作&#xff01;这意味着可以自定…

密码学【java】初探究之springboo集成mybatis,swagger,数字签名

文章目录 项目环境一 swagger技术的补充1.1 [swagger](&#xff08;https://github.com/OAI/OpenAPI-Specification&#xff09;)介绍1.2 swagger的基础注解1.3 controller添加swagger注解 二 项目搭建2.1 创建数据库2.2 引入项目依赖2.3 配置数据库的连接2.4 配置swagger的配置…

USB 字节序,编码格式及位填充

字节序 LSB 发送一个字节时&#xff0c;先发送低位数据&#xff0c;再发送高位数据发送一个字时&#xff0c;先发送低字节数据&#xff0c;再发送高字节数据 例如&#xff1a; 发送 0x2D&#xff0c;发送的顺序为&#xff1a;10110100(低位在前&#xff0c;高位在后)发送 0…

项目前置准备

目录 项目前置准备 总体架构 CVPR2022是什么 一个项目架构图要如何进行看和学习呢&#xff1f;内容有点多有些摸不着头脑 我该如何理解架构图中的组件 Jenkins是什么&#xff1f; Docker是什么&#xff1f; FastDFS是什么&#xff1f; 项目前置准备 总体架构 CVPR2022是什…

golang grpc配置使用实战教程

什么是PRC&GRPC RPC是远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式, RPC 的主要功能目标是让构建分布式计算&#xff08;应用&#xff09;更容易&#xff0c;在提供强大的远程调用能力时不损失本地调用的语义简洁性。通俗地讲&#xff0c;使用RP…

软考 软件设计师 数据结构

大O表示法 常数阶&#xff0c;他的次数不会随着n的变大而变长 抓大头 取次方最大的 时间复杂度 没有循环 没有递归没有跟n相关的东西&#xff0c;那么他的复杂度就是o&#xff08;1&#xff09; 为什么ii*2那里会加1阿&#xff1f; 因为需要加一次才能跳出循环1 2 4 8 中间加…

有趣的回文检测

英文中有很多的回文词&#xff0c;回文词的拼法十分有趣&#xff0c;无论是从前往后拼读&#xff0c;还是从后往前拼读&#xff0c;他们的拼法和词义都不变。例如&#xff1a;dad&#xff08;爸爸&#xff09;&#xff0c;mum&#xff08;妈妈&#xff09;&#xff0c;noon&…

flac格式怎么转换mp3格式?

flac格式怎么转换mp3格式&#xff1f;什么是flac格式呢&#xff1f;通常来说&#xff0c;flac是一种无损音频压缩编码。flac格式主要特点就是无损压缩。对于flac格式而言&#xff0c;与其他有损压缩编码不同&#xff0c;比如与aac、mp3等相较而言&#xff0c;flac对原有的音频信…

PySide6/PyQT多线程之 生命周期:从创建到销毁的完整解析

前言 在PySide6/PyQT 中使用多线程时&#xff0c;多线程生命周期是一个重要的概念。如果不能正确地管理多线程生命周期&#xff0c;可能会导致程序崩溃、内存泄漏等问题。 在前面的文章中有介绍到 PySide6/PyQT 可以实现多线程的多个类&#xff0c; 有 QObject、QThread、QRun…

【C++刷题笔记】继承和多态常见面试题汇总

对C继承和多态方面的部分面试题进行了汇总 一、概念考察 1. 下面哪种面向对象的方法可以让你变得富有( ) A: 继承 B: 封装 C: 多态 D: 抽象 2. ( )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关&#xff0c;而对方法的调用则可以关联于具体…

双目测距--4 双目立体匹配 获取深度图

在这之前需要已经完成双目标定&#xff0c;这里是利用双目标定结果利用SGBM算法获取深度图&#xff0c;以及转伪彩图。 目录 StereoSGBM用到的参数&#xff1a; 一、 预处理参数 二 、代价参数 三 、动态规划参数 四、后处理参数 reprojectImageTo3D函数 获取真实距离 …

ChatGPT - 快速生成 流程图

文章目录 Prompt输出Copy 到 drawio Prompt 我想做一个研发标准化的流程,但是我是一个小白,不懂研发管理的流 程,我希望你作为一个经验丰富的技术管理人员,请帮我梳理一个完整流程,包括需求分析、概要设计,代码走查等等,输出的节点不少于18个,包含逻辑判断的分支,要通循实事求…

【SpringCloud微服务实践】服务注册与发现

注册与发现 在之前的示例中&#xff0c;采取的是硬编码的方式&#xff0c;需要调用的微服务的地址是被我们写死在文件或代码中的。在传统应用程序中&#xff0c;一般都是这么做的&#xff0c;然而这种方式存在不少缺陷&#xff1a; 静态配置&#xff1a;因为是写死的网络地址…

力扣sql中等篇练习(十五)

力扣sql中等篇练习(十五) 1 页面推荐 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # ①找到1所对应的朋友 ②找到其朋友喜欢的页面 ③删选掉自己喜欢的页面 # 可能朋友中存在喜欢同样的界面 SELECT distinct page_id reco…

Java每日一练(20230507) 组合总和、缺失的正数、单词搜索II

目录 1. 组合总和 &#x1f31f;&#x1f31f; 2. 缺失的第一个正数 &#x1f31f;&#x1f31f;&#x1f31f; 3. 单词搜索 II &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

数字化转型导师坚鹏:企业干部如何进行数字化转型

企业干部如何进行数字化转型 ——数字化转型背景下重塑企业干部核心竞争力 授课背景&#xff1a; 很多银行存在以下问题&#xff1a; 企业干部不知道如何进行数字化转型&#xff1f; 企业干部不清楚银行数字化能力模型的内涵&#xff1f; 企业干部不知道如何通过数字化…