【开源工具】 黑客帝国系列系统监控工具:基于PyQt5的全方位资源监控系统

【开源工具】 黑客帝国系列系统监控工具:基于PyQt5的全方位资源监控系统

在这里插入图片描述
请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

请添加图片描述
在这里插入图片描述

摘要

本文介绍了一个基于PyQt5和psutil库开发的系统资源监控工具,该工具不仅具有强大的系统监控功能,还采用了《黑客帝国》电影中经典的"数字雨"视觉效果作为背景。文章将从设计思路、功能实现、代码解析等多个角度详细介绍这个项目,帮助读者理解如何开发一个美观实用的系统监控应用。

关键词:PyQt5、系统监控、数字雨、psutil、Python GUI

目录

  1. 项目概述
  2. 功能特点
  3. 展示效果
  4. 实现步骤
  5. 代码解析
  6. 源码下载
  7. 总结与展望

项目概述

在系统管理和性能优化过程中,实时监控系统资源使用情况是至关重要的。传统的系统监控工具如Windows任务管理器或Linux的top命令虽然功能强大,但界面往往较为单调。本项目将实用性与美观性相结合,开发了一个具有《黑客帝国》风格的系统监控工具。

该工具基于Python的PyQt5 GUI框架和psutil系统信息库,能够实时监控CPU、内存、磁盘、网络、进程、传感器和电池等系统资源,并以图表和数字形式直观展示。最特别的是,它采用了经典的"数字雨"效果作为背景,不仅美观,还能带来独特的用户体验。

功能特点

1. 全面的系统监控

  • CPU监控:显示总体使用率和每个核心的详细使用情况
  • 内存监控:实时显示物理内存和交换空间的使用情况
  • 磁盘监控:监控磁盘I/O和各个分区的使用情况
  • 网络监控:显示网络上传下载速度和各接口状态
  • 进程监控:列出系统进程并按资源使用率排序
  • 传感器监控:显示CPU、GPU温度等传感器数据
  • ** 电池监控**:监控笔记本电池状态和剩余时间

2. 独特的视觉效果

  • 数字雨背景:经典的《黑客帝国》风格下落字符效果
  • 矩阵主题:绿色为主的配色方案,符合黑客帝国美学
  • 动态图表:实时更新的波形图展示资源使用历史

3. 实用的交互功能

  • 多标签页设计:分类展示不同类型的监控信息
  • 主题切换:支持多种视觉主题(当前实现矩阵风格)
  • 刷新率调整:可根据需要调整数据刷新频率
  • 窗口分离:可将任意标签页分离为独立窗口
  • 进程排序:支持按CPU或内存使用率排序进程

4. 技术特点

  • 基于PyQt5实现跨平台GUI
  • 使用psutil获取系统信息
  • 使用matplotlib绘制动态图表
  • 低资源占用,高效实现

🖼️ 展示效果

主界面截图

在这里插入图片描述

图1:系统监控工具主界面,包含数字雨背景和各监控标签页

CPU监控界面

在这里插入图片描述

图2:CPU监控界面,显示各核心使用率波形图

内存监控界面

在这里插入图片描述

图3:内存监控界面,显示内存使用情况和详细信息

显卡监控界面

在这里插入图片描述
图4:显卡监控界面,显示显卡使用情况和详细信息

网络监控界面

在这里插入图片描述
图5:网络监控界面,显示网络使用情况和详细信息

磁盘监控界面

在这里插入图片描述
图6:磁盘监控界面,显示硬盘使用情况和详细信息

进程监控界面

在这里插入图片描述
图7:进程监控界面,显示程序进程使用情况和详细信息

传感器监控界面

在这里插入图片描述

图8:传感器监控界面,显示传感器使用情况和详细信息

电池监控界面

在这里插入图片描述
图9:电池监控界面,监控笔记本电池状态和剩余时间

🧩 实现步骤

1. 环境准备

首先需要安装必要的Python库:

pip install pyqt5 psutil matplotlib

可选安装GPU监控支持:

pip install gputil

2. 项目结构设计

整个项目主要分为两大组件:

  1. MatrixRainWidget:负责数字雨效果的实现
  2. SystemMonitor:主监控界面,包含各种系统监控功能

2.1 项目结构图

在这里插入图片描述

3. 🌧️ 数字雨效果实现

数字雨效果通过自定义QWidget实现,主要步骤包括:

  1. 初始化随机字符集
  2. 根据窗口大小计算合适的列数和行数
  3. 为每一列创建雨滴对象,包含位置、速度、亮度和字符
  4. 定时更新雨滴位置并重绘

4. 📊 系统监控功能实现

系统监控主界面采用QTabWidget组织不同监控类别,每个标签页包含:

  1. 信息摘要标签
  2. 动态波形图表
  3. 详细数据表格或标签

使用QTimer定时更新数据,通过psutil库获取系统信息。

5. 📈 图表绘制

使用matplotlib绘制动态波形图,关键点:

  1. 初始化图表并设置矩阵风格样式
  2. 维护历史数据队列
  3. 定时更新图表数据
  4. 自动调整Y轴范围

6. 主题和交互

实现主题样式、右键菜单、工具栏等功能增强用户体验。

代码解析

1. 数字雨效果核心代码


class MatrixRainWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.characters = "0123456789qwertyuiopasdfghjklzxcvb"
        self.font_size = 12
        self.rain = []
        
        # 初始列数和行数,会在resizeEvent中更新
        self.columns = 0
        self.rows = 0
        
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_rain)
        self.timer.start(100)
        
    def resizeEvent(self, event):
        # 当窗口大小改变时重新计算列数和行数
        font_metrics = QFontMetrics(QFont("MS Gothic", self.font_size))
        char_width = font_metrics.horizontalAdvance("0")
        char_height = font_metrics.height()
        
        if char_width > 0 and char_height > 0:
            self.columns = max(10, self.width() // char_width)
            self.rows = max(5, self.height() // char_height)
        
        self.init_rain()
        super().resizeEvent(event)

性能优化点:

  1. 使用QFontMetrics精确计算字符尺寸
  2. 采用numpy批量生成随机字符
  3. 亮度渐变公式:brightness = 1 - i/length

多线程数据采集在这里插入图片描述

这段代码实现了数字雨效果的核心逻辑。关键在于:

  1. 使用QTimer定时触发更新
  2. 根据窗口大小动态调整雨滴数量和位置
  3. 每个雨滴有独立的位置、速度和亮度属性
  4. 在paintEvent中根据雨滴属性绘制字符

2. 系统监控主界面


class SystemMonitor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("系统资源监控系统")
        self.setGeometry(100, 100, 1400, 900)
        
        # 初始化主题
        self.current_theme = "matrix"
        self.init_theme()
        
        # 主部件和布局
        self.main_widget = QWidget()
        self.setCentralWidget(self.main_widget)
        self.main_layout = QVBoxLayout(self.main_widget)
        self.main_layout.setContentsMargins(0, 0, 0, 0)  # 移除边距
        
        # 添加矩阵数字雨背景(先添加,确保在最底层)
        self.matrix_rain = MatrixRainWidget(self.main_widget)
        self.matrix_rain.setGeometry(0, 0, self.width(), self.height())
        
        # 创建标签页(后添加,确保在上层)
        self.tabs = QTabWidget()
        self.tabs.setStyleSheet("background: transparent;")  # 设置标签页透明
        self.main_layout.addWidget(self.tabs)

主界面采用分层设计:

  1. 最底层是数字雨背景
  2. 上层是半透明的标签页控件
  3. 通过样式表设置矩阵风格的主题

3. CPU监控实现

def create_cpu_tab(self):
    """创建CPU监控标签页"""
    self.cpu_tab = QWidget()
    self.tabs.addTab(self.cpu_tab, "CPU")
    
    layout = QVBoxLayout(self.cpu_tab)
    
    # CPU信息标签
    self.cpu_info_label = QLabel()
    self.cpu_info_label.setFont(QFont("Consolas", 10))
    layout.addWidget(self.cpu_info_label)
    
    # CPU使用率波形图
    self.cpu_fig, self.cpu_ax = plt.subplots(figsize=(10, 6))
    self.setup_chart_style(self.cpu_fig, self.cpu_ax, "CPU Usage (%)")
    
    # 初始化CPU核心线
    self.cpu_lines = []
    for i in range(psutil.cpu_count()):
        line, = self.cpu_ax.plot([], [], label=f'Core {
     
     i+1}', color=self.get_green_color(i))
        self.cpu_lines.append(line)
    
    self.cpu_ax.set_ylim(0, 100)
    self.cpu_ax.set_xlim(0, 60)
    self.cpu_ax.legend(facecolor='black', labelcolor='#00FF00')
    
    self.cpu_canvas = FigureCanvas(self.cpu_fig)
    layout.addWidget(self.cpu_canvas)

CPU监控标签页包含:

  1. 总体信息标签
  2. 每个核心的波形图
  3. 自动调整的坐标轴
  4. 矩阵风格的图表样式

4. 数据更新机制

def update_all(self):
    """更新所有监控数据"""
    self.update_cpu()
    self.update_memory()
    self.update_gpu()
    self.update_network()
    self.update_disk()
    self.update_processes()
    self.update_sensors()
    self.update_battery()
    
    # 更新状态栏
    self.status_bar.setText(time.strftime("%Y-%m-%d %H:%M:%S") + 
                          " | System Monitoring Active | Press Ctrl+Q to exit")

def update_cpu(self):
    """更新CPU数据"""
    # 获取CPU使用率
    cpu_percent = psutil.cpu_percent(interval=0.1, percpu=True)
    
    # 更新数据
    for i, percent in enumerate(cpu_percent):
        self.cpu_data[i].append(percent)
        if len(self.cpu_data[i]) > 60:  # 保留60秒数据
            self.cpu_data[i] = self.cpu_data[i][-60:]
    
    # 更新图表
    for i, line in enumerate(self.cpu_lines):
        line.set_data(range(len(self.cpu_data[i])), self.cpu_data[i])
    
    # 自动调整Y轴范围
    max_val = max([max(core) for core in self.cpu_data if core] + [10])
    self.cpu_ax.set_ylim(0, max(100, max_val * 1.1))

数据更新采用统一机制:

  1. QTimer定时触发update_all
  2. 每个监控类别有独立的更新方法
  3. 维护固定长度的历史数据队列
  4. 自动调整图表范围

源码下载

复制本文提供的完整代码保存为system_monitor.py文件。

import sys
import time
import psutil
import numpy as np
from PyQt5.QtCore import Qt, QTimer, QRect, QPoint, pyqtSignal, QThread
from PyQt5.QtGui import QFont, QColor, QPainter, QPen, QLinearGradient, QBrush, QFontMetrics
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
                            QLabel, QTabWidget, QGridLayout, QMenu, QAction, QToolBar,
                            QDockWidget, QScrollArea, QSizePolicy, QSplitter,
                            QTableWidget, QTableWidgetItem, QHeaderView)
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

class MatrixRainWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.characters = "0123456789qwertyuiopasdfghjklzxcvb"
        self.font_size = 12
        self.rain = []
        
        # 初始列数和行数,会在resizeEvent中更新
        self.columns = 0
        self.rows = 0
        
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_rain)
        self.timer.start(0)
        
    def resizeEvent(self, event):
        # 当窗口大小改变时重新计算列数和行数
        font_metrics = QFontMetrics(QFont("MS Gothic", self.font_size))
        char_width = font_metrics.horizontalAdvance("0")
        char_height = font_metrics.height()
        
        if char_width > 0 and char_height > 0:
            self.columns = max(10, self.width() // char_width)
            self.rows = max(5, self.height() // char_height)
        
        self.init_rain()
        super().resizeEvent(event)
        
    def init_rain(self):
        self.rain = []
        for i in range(self.columns):
            length = np.random.randint(5, self.rows)
            speed = np.random.uniform(0.5, 1.5)
            start_pos = np.random.randint(-self.rows, 0)
            self.rain.append({
   
   
                'length': length,
                'speed': speed,
                'position': start_pos,
                'chars': [np.random.choice(list(self.characters)) for _ in range(length)],
                'brightness': [max(0.1, 1 - i/length) for i in range(length)]
            })
    
    def update_rain(self):
        for drop in self.rain:
            drop['position'] += drop['speed']
            if drop['position'] - drop['length'] > self.rows:
                drop['position'] = np.random.randint(-self.rows, 0)
                drop['chars'] = [np.random.choice(list(self.characters)) for _ in range(drop['length'])]
        self.update()
    
    def paintEvent(self, event):
        if not self.rain:
            return
            
        painter = QPainter(self)
        painter.setFont(QFont("MS Gothic", self.font_size))
        
        font_metrics = painter.fontMetrics()
        char_width = font_metrics.horizontalAdvance("0")
        char_height = font_metrics.height()
        
        if char_width == 0 or char_height == 0:
            return
            
        for i, drop in enumerate(self.rain):
            x = i * char_width
            for j in range(drop['length']):
                y_pos = drop['position'] - j
                if 0 <= y_pos < self.rows:
                    y = y_pos * char_height
                    brightness = drop['brightness'][j]
                    color = QColor(0, int(255 * brightness), 0
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创客白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值