【趣味Python】第7课:炫酷计算器资源占用率可视化

专栏导读

请添加图片描述

在这里插入图片描述

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

背景介绍

  • 大家好!今天我们要用Python打造一个超酷的系统资源监控仪表盘,实时显示你的电脑CPU、内存、磁盘和网络使用情况。这个项目不仅实用,而且视觉效果非常炫酷,特别适合放在副屏上实时监控电脑状态!

项目效果预览

这个仪表盘会实时显示:

  • CPU使用率曲线
  • 内存占用百分比
  • 磁盘使用情况
  • 网络上传下载流量

库的安装

我们需要用到以下几个Python库:

  • dash:用于构建交互式Web仪表盘
  • plotly:创建漂亮的动态图表
  • psutil:获取系统资源使用信息
用途安装
dash构建交互式Web仪表盘pip install dash -i https://pypi.tuna.tsinghua.edu.cn/simple/
plotly创建漂亮的动态图表pip install plotly -i https://pypi.tuna.tsinghua.edu.cn/simple/
psutil获取系统资源使用信息pip install psutil -i https://pypi.tuna.tsinghua.edu.cn/simple/

代码解析

让我们一步步来看这个项目的核心代码:

1. 初始化应用和数据

  • 这里我们初始化了Dash应用,并创建了存储各种指标的列表。网络数据转换为MB单位以便于阅读。

import dash
from dash import dcc, html
from dash.dependencies import Output, Input
import plotly.graph_objs as go
import psutil
import datetime

# 初始化Dash应用
app = dash.Dash(__name__)
app.title = "计算器资源占用率可视化"

# 初始化数据
X = [datetime.datetime.now()]
cpu = [psutil.cpu_percent()]
mem = [psutil.virtual_memory().percent]
disk = [psutil.disk_usage('/').percent]
net_sent = [psutil.net_io_counters().bytes_sent / 1024 / 1024]
net_recv = [psutil.net_io_counters().bytes_recv / 1024 / 1024]

2. 创建仪表盘布局

  • 我们设置了黑色背景(#111)和白色文字的整体风格,创建了四个图表区域和一个每秒触发一次的定时器。

app.layout = html.Div(style={'backgroundColor': '#111', 'color': '#fff', 'padding': '10px'}, children=[
    html.H1("计算器占用率动态可视化", style={'textAlign': 'center'}),
    dcc.Graph(id='cpu-graph'),
    dcc.Graph(id='mem-graph'),
    dcc.Graph(id='disk-graph'),
    dcc.Graph(id='net-graph'),
    dcc.Interval(id='interval', interval=1000, n_intervals=0)
])

3. 实时更新数据

  • 这个回调函数每秒执行一次,获取最新的系统数据并更新图表。我们限制只保留最近60个数据点,避免图表过于拥挤。

@app.callback(
    Output('cpu-graph', 'figure'),
    Output('mem-graph', 'figure'),
    Output('disk-graph', 'figure'),
    Output('net-graph', 'figure'),
    Input('interval', 'n_intervals')
)
def update_metrics(n):
    global X, cpu, mem, disk, net_sent, net_recv
    now = datetime.datetime.now()
    X.append(now)
    cpu.append(psutil.cpu_percent())
    mem.append(psutil.virtual_memory().percent)
    disk.append(psutil.disk_usage('/').percent)
    net_sent.append(psutil.net_io_counters().bytes_sent / 1024 / 1024)
    net_recv.append(psutil.net_io_counters().bytes_recv / 1024 / 1024)

    # 限制最多显示60个点
    X = X[-60:]
    cpu = cpu[-60:]
    mem = mem[-60:]
    disk = disk[-60:]
    net_sent = net_sent[-60:]
    net_recv = net_recv[-60:]

4. 创建图表

  • 这里我们为每个指标创建了不同颜色的曲线图,保持统一的暗黑风格界面。

return (
    go.Figure(data=[go.Scatter(x=X, y=cpu, mode='lines+markers', line=dict(color='cyan'))],
              layout=go.Layout(title='CPU 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
    go.Figure(data=[go.Scatter(x=X, y=mem, mode='lines+markers', line=dict(color='lime'))],
              layout=go.Layout(title='内存 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
    go.Figure(data=[go.Scatter(x=X, y=disk, mode='lines+markers', line=dict(color='orange'))],
              layout=go.Layout(title='磁盘 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
    go.Figure(data=[
        go.Scatter(x=X, y=net_sent, mode='lines', name='发送 MB', line=dict(color='magenta')),
        go.Scatter(x=X, y=net_recv, mode='lines', name='接收 MB', line=dict(color='aqua')),
    ], layout=go.Layout(title='网络传输 (MB)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff')))
)

如何运行

  • 存代码为monitor.py,然后在终端运行:

python monitor.py
  • 打开浏览器访问 http://127.0.0.1:8050/ 就能看到实时监控仪表盘了!

完整代码

import dash
from dash import dcc, html
from dash.dependencies import Output, Input
import plotly.graph_objs as go
import psutil
import datetime

# 初始化Dash应用
app = dash.Dash(__name__)
app.title = "计算器资源占用率可视化"

# 初始化数据
X = [datetime.datetime.now()]
cpu = [psutil.cpu_percent()]
mem = [psutil.virtual_memory().percent]
disk = [psutil.disk_usage('/').percent]
net_sent = [psutil.net_io_counters().bytes_sent / 1024 / 1024]
net_recv = [psutil.net_io_counters().bytes_recv / 1024 / 1024]

# 布局
app.layout = html.Div(style={'backgroundColor': '#111', 'color': '#fff', 'padding': '10px'}, children=[
    html.H1("计算器占用率动态可视化", style={'textAlign': 'center'}),
    dcc.Graph(id='cpu-graph'),
    dcc.Graph(id='mem-graph'),
    dcc.Graph(id='disk-graph'),
    dcc.Graph(id='net-graph'),
    dcc.Interval(id='interval', interval=1000, n_intervals=0)
])

# 回调更新图表
@app.callback(
    Output('cpu-graph', 'figure'),
    Output('mem-graph', 'figure'),
    Output('disk-graph', 'figure'),
    Output('net-graph', 'figure'),
    Input('interval', 'n_intervals')
)
def update_metrics(n):
    global X, cpu, mem, disk, net_sent, net_recv
    now = datetime.datetime.now()
    X.append(now)
    cpu.append(psutil.cpu_percent())
    mem.append(psutil.virtual_memory().percent)
    disk.append(psutil.disk_usage('/').percent)
    net_sent.append(psutil.net_io_counters().bytes_sent / 1024 / 1024)
    net_recv.append(psutil.net_io_counters().bytes_recv / 1024 / 1024)

    # 限制最多显示60个点
    X = X[-60:]
    cpu = cpu[-60:]
    mem = mem[-60:]
    disk = disk[-60:]
    net_sent = net_sent[-60:]
    net_recv = net_recv[-60:]

    return (
        go.Figure(data=[go.Scatter(x=X, y=cpu, mode='lines+markers', line=dict(color='cyan'))],
                  layout=go.Layout(title='CPU 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
        go.Figure(data=[go.Scatter(x=X, y=mem, mode='lines+markers', line=dict(color='lime'))],
                  layout=go.Layout(title='内存 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
        go.Figure(data=[go.Scatter(x=X, y=disk, mode='lines+markers', line=dict(color='orange'))],
                  layout=go.Layout(title='磁盘 使用率 (%)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff'))),
        go.Figure(data=[
            go.Scatter(x=X, y=net_sent, mode='lines', name='发送 MB', line=dict(color='magenta')),
            go.Scatter(x=X, y=net_recv, mode='lines', name='接收 MB', line=dict(color='aqua')),
        ], layout=go.Layout(title='网络传输 (MB)', paper_bgcolor='#111', plot_bgcolor='#222', font=dict(color='#fff')))
    )

# 启动服务器
if __name__ == '__main__':
    app.run(debug=False)

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小庄-Python办公

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

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

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

打赏作者

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

抵扣说明:

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

余额充值