当前位置: 首页 > news >正文

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

  • 0. 前言
  • 1. 资源信息获取函数——monitor.py
  • 2. UI界面——listen.py
  • 3. main.py
  • 4. 运行效果
  • 5. 编译 exe 程序
  • 6. 其他PyQt文章

0. 前言

利用 PyQt5 开发一个 windows 的资源监视助手,在使用虚拟机的时候有大用,因为某些缘故我需要同时开启多个虚拟机,开多了往往会卡,所以需要进行简单拿到监视内存看看是否内存够用。

操作系统:Windows10 专业版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:PyQt5、psutil

显示器分辨率:1920 x 1080

1. 资源信息获取函数——monitor.py

使用下面这个函数来获取内存、CPU等资源信息

# code:utf-8
# Create by Maxtang
# 2023/5/3
import psutildef monitor():mem = psutil.virtual_memory()# 系统总计内存cpu = psutil.cpu_percent(interval=0.2)percent = mem.used / mem.total# 内存总量total = float(mem.total) / 1024 / 1024 / 1024# 已经使用used = float(mem.used) / 1024 / 1024 / 1024# 剩余量free = float(mem.free) / 1024 / 1024 / 1024# cpu占用cpu = str(cpu)[:4]# 内存占用百分比percent = str(percent)[:6]used = str(used)[:4]free = str(free)[:4]total = str(total)[:4]# li = [cpu, total,used,free,percent]# print(li)data = {"cpu":cpu,"total":total,"used":used,"free":free,"percent":percent}return dataif __name__ == '__main__':print(monitor())

效果如下:
在这里插入图片描述

2. UI界面——listen.py

这个就没什么好说的,创建一个Python文件命名为 listen.py 就好了

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '.\listen.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(355, 135)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.widget = QtWidgets.QWidget(self.centralwidget)self.widget.setGeometry(QtCore.QRect(0, 0, 352, 39))self.widget.setObjectName("widget")self.gridLayout = QtWidgets.QGridLayout(self.widget)self.gridLayout.setContentsMargins(0, 0, 0, 0)self.gridLayout.setObjectName("gridLayout")self.label_6 = QtWidgets.QLabel(self.widget)self.label_6.setAlignment(QtCore.Qt.AlignCenter)self.label_6.setObjectName("label_6")self.gridLayout.addWidget(self.label_6, 1, 1, 1, 1)self.label_4 = QtWidgets.QLabel(self.widget)self.label_4.setAlignment(QtCore.Qt.AlignCenter)self.label_4.setObjectName("label_4")self.gridLayout.addWidget(self.label_4, 0, 3, 1, 1)self.label_3 = QtWidgets.QLabel(self.widget)self.label_3.setAlignment(QtCore.Qt.AlignCenter)self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 0, 2, 1, 1)self.label = QtWidgets.QLabel(self.widget)self.label.setAlignment(QtCore.Qt.AlignCenter)self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 0, 0, 1, 1)self.label_8 = QtWidgets.QLabel(self.widget)self.label_8.setAlignment(QtCore.Qt.AlignCenter)self.label_8.setObjectName("label_8")self.gridLayout.addWidget(self.label_8, 1, 2, 1, 1)self.label_5 = QtWidgets.QLabel(self.widget)self.label_5.setAlignment(QtCore.Qt.AlignCenter)self.label_5.setObjectName("label_5")self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1)self.label_7 = QtWidgets.QLabel(self.widget)self.label_7.setAlignment(QtCore.Qt.AlignCenter)self.label_7.setObjectName("label_7")self.gridLayout.addWidget(self.label_7, 1, 3, 1, 1)self.label_2 = QtWidgets.QLabel(self.widget)self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)self.widget1 = QtWidgets.QWidget(self.centralwidget)self.widget1.setGeometry(QtCore.QRect(30, 40, 295, 30))self.widget1.setObjectName("widget1")self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget1)self.horizontalLayout.setContentsMargins(0, 0, 0, 0)self.horizontalLayout.setObjectName("horizontalLayout")self.pushButton = QtWidgets.QPushButton(self.widget1)self.pushButton.setObjectName("pushButton")self.horizontalLayout.addWidget(self.pushButton)self.pushButton_2 = QtWidgets.QPushButton(self.widget1)self.pushButton_2.setObjectName("pushButton_2")self.horizontalLayout.addWidget(self.pushButton_2)self.pushButton_3 = QtWidgets.QPushButton(self.widget1)self.pushButton_3.setObjectName("pushButton_3")self.horizontalLayout.addWidget(self.pushButton_3)MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 355, 26))self.menubar.setDefaultUp(False)self.menubar.setNativeMenuBar(False)self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "Windows资源监视器"))self.label_6.setText(_translate("MainWindow", "TextLabel"))self.label_4.setText(_translate("MainWindow", "内存占用百分比"))self.label_3.setText(_translate("MainWindow", "剩余内存/G"))self.label.setText(_translate("MainWindow", "CPU"))self.label_8.setText(_translate("MainWindow", "TextLabel"))self.label_5.setText(_translate("MainWindow", "TextLabel"))self.label_7.setText(_translate("MainWindow", "TextLabel"))self.label_2.setText(_translate("MainWindow", "内存占用/G"))self.pushButton.setText(_translate("MainWindow", "启动"))self.pushButton_2.setText(_translate("MainWindow", "终止"))self.pushButton_3.setText(_translate("MainWindow", "退出"))

3. main.py

下面这个就是main函数,你需要先创建以上文件 [monitor.py、listen.py] ,否则将会报错无法运行

import sys
from PyQt5 import  QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *import listen
from monitor import monitor
import timeclass UI(QMainWindow, listen.Ui_MainWindow):def __init__(self):super(UI, self).__init__()self.setupUi(self)self.pushButton.clicked.connect(lambda:{self.start(),self.fun()})self.pushButton_2.clicked.connect(lambda:{self.join(),self.fun()})self.pushButton_3.clicked.connect(lambda:{exit(0)})self.move((1920-355)//2,1080-120)# 隐藏任务栏图标self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.SplashScreen | Qt.FramelessWindowHint | Qt.FramelessWindowHint)# 设置窗口背景透明self.setWindowOpacity(0.85)  # 设置窗口透明度self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明# # 设置按钮透明# op = QtWidgets.QGraphicsOpacityEffect()# op.setOpacity(0.35) # 设置透明度的值,0.0到1.0,最小值0是透明,1是不透明# self.pushButton.setGraphicsEffect(op)global flagflag = 0def start(self):global flagflag = 1# print("start")def join(self):global flagflag = 0# print("join")def fun(self):# print("ok")while flag == 1:data = monitor()self.label_5.setText("{}%".format(data["cpu"]))self.label_6.setText("{}/{}G".format(data["used"],data["total"]))self.label_8.setText("{}/{}G".format(data["free"],data["total"]))self.label_7.setText("{:.2f}%".format(float(data["percent"])*100))QtWidgets.QApplication.processEvents()time.sleep(0.2)app = QtWidgets.QApplication(sys.argv)
main = UI()
main.show()
sys.exit(app.exec_())

4. 运行效果

按下启动按键之后,就会开始监视计算机的CPU资源,它是刚好浮于状态栏上方的,这个位置被我调整过。而且由于下面的代码,导致它不显示选项卡和任务栏图标:

self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.SplashScreen | Qt.FramelessWindowHint | Qt.FramelessWindowHint)

在这里插入图片描述

5. 编译 exe 程序

为了避免每次都需要打开Pycharm项目,我决定将它编译为 exe 程序,这样一来我只需要双机程序就能运行了

Python不像C语言,需要我们安装第三方库来进行编译。

第三方库:Pyinstaller,首先你需要安装 Pyinstaller 库,如果你还不会安装库,你可以参考我的这个文章来学习:

Python第三方库安装——使用vscode、pycharm安装Python第三方库

在我们的项目所在目录打开 PowerShell
在这里插入图片描述
然后输入以下命令:

Pyinstaller -F main.py

在这里插入图片描述

历时30多秒后控制台提示我们编译成功:
在这里插入图片描述
这时候回到你的项目目录下,在这个里面,你能找到你编译好的程序:
在这里插入图片描述
双击它就可以运行啦!
在这里插入图片描述

我给它增加了一点其他功能,让它不只是资源监视那么简单,我增加了一个爬虫来爬取我csdn的状态信息,为了不被系统检测到爬虫攻击,我选择的是使用手动更新按钮:
在这里插入图片描述

在这里插入图片描述

6. 其他PyQt文章

如果你对 PyQt 学习有点兴趣,你可以看看我的其他PyQt文章:

基于PyQt5的图形化界面开发——自制MQTT客户端软件
基于PyQt5的图形化界面开发——自制Redis图形化客户端
基于PyQt5的图形化界面开发——模拟医院管理系统
基于PyQt5的图形化界面开发——PyQt示例_计算器
基于PyQt5的图形化界面开发——PyQt示例_扫雷

相关文章:

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程] 0. 前言1. 资源信息获取函数——monitor.py2. UI界面——listen.py3. main.py4. 运行效果5. 编译 exe 程序6. 其他PyQt文章 0. 前言 利用 PyQt5 开发一个 windows 的资源监视助手,在使用虚…...

Linus Torvalds发布了第一个Linux内核6.4候选版本

导读自Linux内核6.3发布和下一个内核系列Linux 6.4的合并窗口开放以来,已经过去了一段时间,近日,Linus Torvalds发布了第一个RC(候选发布版)的里程碑,供公众测试。 为期两周的Linux内核6.4合并窗口现已关闭…...

由浅入深Dubbo核心源码剖析环境介绍

目录 1 框架介绍1.1 概述1.2 运行架构1.3 整体设计 2 环境搭建2.1 源码拉取2.2 源码结构2.3 环境导入2.4 测试2.5 管理控制台 1 框架介绍 1.1 概述 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#…...

Java 远程连接 SQLite 数据库

Java 可以使用 JDBC API 来连接 SQLite 数据库。但是,SQLite 不支持远程连接,因为它是一种文件数据库,需要直接访问数据库文件。 如果您需要从远程位置访问 SQLite 数据库,可以将 SQLite 数据库文件放在共享文件夹中,…...

网安面试题大全(附答案)

本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手…...

windows 系统扩容C盘注意事项

windows系统大家都不陌生,是大家用的最多的操作系统。在实际的使用中,遇到需要扩容C盘的情况不是很多,但是如果遇到了,有以下几个事项需要大家注意: 剩余空间是否充足 不论当前服务器是物理服务器还是虚拟机&#xff…...

接入支付宝沙箱环境

1、这里有几个重要数据要拿到,一个是支付宝的公钥和私钥,一个是支付的网关,和支付的APPID。这几个数据是要写到代码中的 官方手册:文档地址 1.1 配置沙箱应用环境 https://openhome.alipay.com/develop/sandbox/app 1.2 配置接口…...

用原生JS实现虚拟列表(IT枫斗者)

用原生JS实现虚拟列表 介绍 最近在开发需求的时候,有用到 Antd 的虚拟列表组件 rc-virtual-list ,粗略地看了一下源码,于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的,而且在列表滚动的过程…...

FAT NTFS Ext3文件系统有什么区别

10 年前 FAT 文件系统还是常见的格式,而现在 Windows 上主要是 NTFS,Linux 上主要是Ext3、Ext4 文件系统。关于这块知识,一般资料只会从支持的磁盘大小、数据保护、文件名等各种维度帮你比较,但是最本质的内容却被一笔带过。它们最…...

信息收集思路

1、开发者注释 在网站前端代码中遗留的开发者注释 其中可能包含某些关键信息 ​ 💡 使用F12 、CtrlU 、view-source: 查看前端源码 ​ 3、Robots文件 爬虫协议,网站根目录存在的robots.txt文件,用于告知搜索引擎或爬虫哪些路径和页面不…...

Tauri应用开发(二):创建第一个Tauri应用

创建tauri应用 推荐参考官方文档:https://tauri.app/v1/guides/ 创建命令: npm create tauri-applatest💡注意:请确保Node.js和Rust已经正确安装 在创建过程中,需要根据提示选择配置项。 主要配置有: 项目…...

自信裸辞:一晃 ,失业都3个月了.....

最近,找了很多软测行业的朋友聊天、吃饭 ,了解了一些很意外的现状 。 我一直觉得他们技术非常不错,也走的测开/管理的路径;二三月份裸辞的,然后一直在找工作,现在还没找到工作 。 经过我的分析&#xff0…...

Python3 输入和输出

在Python 3中,你可以使用内置的函数来进行输入和输出操作。 输入(Input): 要从用户那里获取输入,可以使用input()函数。input()函数会等待用户输入,并返回一个字符串。你可以将输入存储在一个变量中&#…...

Mybatis Plus 使用@TableLogic实现逻辑删除

文章目录 步骤1:修改数据库表添加deleted列步骤2:实体类添加属性步骤3:运行删除方法知识点1:TableLogic 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多…...

2023/5/23总结

super关键字 super关键字的用法和this 关键字的用法相似 this:代表本类对象的引用(this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字,所以我们常说this代表本类对象的引用)super:代表父类存储空间的标识(可以理解为父类对象…...

Squid代理服务器应用

在web架构中,用户一般进入负载均衡层,通过调度来访问web应用层,但是如果访问量太大,并发量较高,web应用层会吃不消,我们把静态资源、经常要访问的资源放入缓存,用户直接访问缓存层,加…...

网络编程中的sockfd是什么?

2023年5月22日,周一早上: 今天早上学习网络编程时遇到了sockfd这个变量,于是学习了一下,顺便写篇博客来记录自己的学习成功。 sockfd是什么意思? "sock"是socket的缩写。"fd"则是file descripto…...

如何利用Citespace和vosviewer既快又好地写出高质量的论文及快速锁定热点和重点文献进行可视化分析?

基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法 CiteSpace是什么? 简单来说,它一款通过将国内外文献进行可视化分析来帮助你了解一门学科前世今生的软件。 面对成千上万篇的文献,怎样才能快速锁定自己最感兴趣的主题及科学…...

(学习日记)AD学习 #1

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…...

缓存存在的问题

文章目录 缓存问题缓存穿透引入解决方案 缓存雪崩缓存击穿 缓存问题 使用缓存时常见的问题主要分为三个:缓存穿透 、缓存雪崩、缓存击穿。 下面对其进行一一学习 缓存穿透 引入 定义:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制&#xff0…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...