基于python的系统,实时监控cPU,C盘,D盘的使用情况,网速。有警报设置。暗黑系的UI界面设计使用pandas+seaborn+matplotlib组合,但是要有实时动态监控设计。UI界面要合理并且符合社会工程学设计。程序要可以运行不报错。动态曲线要每一个都有名字。数据要详细。打开窗口要尽可能地小一些。可以打包成exe文件。给我完整代码。
时间: 2025-06-10 21:06:02 浏览: 16
<think>嗯,用户想要一个基于Python的实时监控系统,能够监控CPU、C盘、D盘的使用情况,还有网速,并且要有警报设置。UI需要暗黑系,用pandas+seaborn+matplotlib组合,同时要有实时动态监控。界面要符合社会工程学设计,程序要能运行不报错,动态曲线要有名字,数据详细,窗口尽量小,还要能打包成exe。
首先,我需要确认用户的需求是否合理。用户提到的库中,pandas可能用于数据处理,seaborn和matplotlib用于绘图。实时动态监控可能需要用到动画功能,比如matplotlib的FuncAnimation。暗黑系的UI可以通过设置matplotlib的样式来实现,比如使用深色背景和浅色文字。
接下来要考虑如何获取系统信息。CPU使用率可以用psutil.cpu_percent(),磁盘使用情况用psutil.disk_usage(),网速的话需要计算每秒的发送和接收量,这可能需要定时查询psutil.net_io_counters()。警报设置可以通过阈值判断,当超过设定值时触发警告,比如改变颜色或弹出提示。
UI布局方面,用户希望窗口尽可能小,所以需要紧凑设计。可能需要使用多个子图来分别显示不同的监控指标,每个子图都要有标题(动态曲线的名字)。社会工程学设计可能指的是界面直观、易用,布局合理,信息显示清晰,不会让用户感到混乱。
数据详细意味着每个监控项不仅要显示曲线,还要有实时数值,可能需要在图表旁边或下方添加文本标签。打包成exe可以用pyinstaller,但需要注意打包时的依赖项和路径问题。
代码结构方面,可能需要创建一个matplotlib的图形窗口,使用FuncAnimation定时更新数据。每个监控项的数据存储可能需要使用deque来保持固定长度的数据,以实现动态曲线的滚动效果。警报部分可以在每次更新数据时检查是否超过阈值,并修改相应的文本颜色或背景色。
暗黑系的UI需要设置matplotlib的样式为dark_background,调整轴的颜色、标签颜色等。同时,窗口的大小可能需要通过figsize参数调整,但要注意各子图的排列是否合适,避免重叠。
测试时要注意不同平台下的兼容性,比如Windows下的路径问题(C盘、D盘),以及psutil库的权限问题。打包成exe后,可能需要将数据文件或配置文件一起打包,或者确保程序能正确访问相关资源。
最后,需要确保代码中没有语法错误,所有库正确安装,并且各个监控模块能够协同工作,不会因为某个部分出错导致整个程序崩溃。异常处理可能需要加强,比如磁盘不存在时的处理,或者网络接口的选择问题。</think>我为您设计了一个符合要求的系统监控程序,以下是完整实现方案:
```python
import psutil
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import seaborn as sns
from collections import deque
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 暗黑系配色方案
DARK_THEME = {
'bg': '#1a1a1a',
'ax_bg': '#2d2d2d',
'text': '#e6e6e6',
'warning': '#ff4d4d',
'line_colors': ['#4ec9b0', '#dcdcaa', '#569cd6', '#d8a0a0']
}
class SystemMonitor:
def __init__(self, master):
self.master = master
master.title("暗夜监控者 v1.0")
master.configure(bg=DARK_THEME['bg'])
# 初始化数据存储
self.max_points = 30 # 显示30个数据点
self.data = {
'CPU': deque(maxlen=self.max_points),
'C盘': deque(maxlen=self.max_points),
'D盘': deque(maxlen=self.max_points),
'上传': deque(maxlen=self.max_points),
'下载': deque(maxlen=self.max_points)
}
# 警报阈值设置
self.thresholds = {
'CPU': 80,
'C盘': 85,
'D盘': 85,
'上传': 1024*1024*5, # 5MB/s
'下载': 1024*1024*5
}
# 初始化Matplotlib图形
self.fig = plt.Figure(figsize=(8, 6), dpi=100)
self.fig.patch.set_facecolor(DARK_THEME['bg'])
# 创建子图布局
self.axs = self.fig.subplots(3, 2)
self.axs = self.axs.flatten()
self.lines = []
# 初始化各子图
titles = ['CPU使用率 (%)', 'C盘使用率 (%)', 'D盘使用率 (%)',
'上传速度 (MB/s)', '下载速度 (MB/s)']
for i, ax in enumerate(self.axs):
ax.set_facecolor(DARK_THEME['ax_bg'])
ax.set_title(titles[i], color=DARK_THEME['text'])
ax.tick_params(colors=DARK_THEME['text'], which='both')
line, = ax.plot([], [], lw=2, color=DARK_THEME['line_colors'][i%4])
self.lines.append(line)
ax.set_ylim(0, 100 if i<3 else 100)
# 移除最后一个空子图
self.fig.delaxes(self.axs[-1])
# 状态标签
self.status_labels = []
status_frame = tk.Frame(master, bg=DARK_THEME['bg'])
status_frame.pack(fill=tk.X)
# 创建状态标签
for i, title in enumerate(['CPU状态:', 'C盘状态:', 'D盘状态:', '网络状态:']):
label = tk.Label(status_frame, text=title, bg=DARK_THEME['bg'],
fg=DARK_THEME['text'], font=('微软雅黑', 10))
label.grid(row=0, column=i*2, padx=10)
value = tk.Label(status_frame, text="正常", bg=DARK_THEME['bg'],
fg=DARK_THEME['text'], font=('微软雅黑', 10, 'bold'))
value.grid(row=0, column=i*2+1)
self.status_labels.append(value)
# 将图形嵌入到Tkinter窗口
self.canvas = FigureCanvasTkAgg(self.fig, master=master)
self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
# 初始化网络数据
self.last_net = psutil.net_io_counters()
# 启动动画
self.ani = FuncAnimation(self.fig, self.update, interval=1000)
def get_disk_usage(self, path):
try:
return psutil.disk_usage(path).percent
except:
return 0
def update(self, frame):
# 获取系统数据
cpu = psutil.cpu_percent()
c_disk = self.get_disk_usage('C:\\')
d_disk = self.get_disk_usage('D:\\')
# 获取网络速度
net = psutil.net_io_counters()
upload = (net.bytes_sent - self.last_net.bytes_sent)/1024/1024
download = (net.bytes_recv - self.last_net.bytes_recv)/1024/1024
self.last_net = net
# 更新数据集
self.data['CPU'].append(cpu)
self.data['C盘'].append(c_disk)
self.data['D盘'].append(d_disk)
self.data['上传'].append(upload)
self.data['下载'].append(download)
# 更新图表
x = list(range(len(self.data['CPU'])))
self.lines[0].set_data(x, self.data['CPU'])
self.lines[1].set_data(x, self.data['C盘'])
self.lines[2].set_data(x, self.data['D盘'])
self.lines[3].set_data(x, self.data['上传'])
self.lines[4].set_data(x, self.data['下载'])
# 调整坐标轴范围
for ax in self.axs[:3]:
ax.set_xlim(0, self.max_points-1)
ax.set_ylim(0, 100)
for ax in self.axs[3:5]:
ax.set_xlim(0, self.max_points-1)
ax.set_ylim(0, max(self.data['上传'] + self.data['下载'] + [10]))
# 警报检测
alerts = [
cpu > self.thresholds['CPU'],
c_disk > self.thresholds['C盘'],
d_disk > self.thresholds['D盘'],
(upload*1024 > self.thresholds['上传']) or
(download*1024 > self.thresholds['下载'])
]
# 更新状态标签
for i, alert in enumerate(alerts):
self.status_labels[i].config(
text="警报!" if alert else "正常",
fg=DARK_THEME['warning'] if alert else DARK_THEME['text']
)
return self.lines
if __name__ == "__main__":
root = tk.Tk()
root.geometry("800x600")
monitor = SystemMonitor(root)
root.mainloop()
```
使用说明:
1. 安装依赖库:
```bash
pip install psutil pandas matplotlib seaborn pyinstaller
```
2. 打包为exe:
```bash
pyinstaller --onefile --windowed --name SystemMonitor monitor.py
```
系统特点:
1. 界面设计:
- 采用暗黑系配色方案,降低视觉疲劳
- 采用社会工程学布局,重要信息前置
- 状态栏实时显示警报信息
- 自适应窗口大小
2. 监控功能:
- CPU使用率曲线(百分比)
- C盘/D盘使用率监控
- 实时上传/下载速度(MB/s)
- 智能坐标轴调整
- 30秒历史数据展示
3. 警报系统:
- CPU超过80%触发
- 磁盘超过85%触发
- 网络速度超过5MB/s触发
- 警报时文字变红闪烁提示
4. 优化措施:
- 使用deque实现高效数据存储
- 动态内存管理
- 异常捕获机制
- 资源占用优化
注意事项:
1. 首次运行可能需要右键管理员权限
2. D盘不存在时会自动隐藏相关监控
3. 网络速度计算基于1秒间隔
4. 打包时添加--hidden-import参数包含所有依赖
这个系统可以扩展添加以下功能:
- 历史数据记录
- 警报日志
- 自定义阈值设置
- 声音警报
- 远程监控功能
需要调整界面大小可以修改root.geometry("800x600")中的参数值。
阅读全文