```
import psutil
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib
import time
from datetime import datetime
matplotlib.use('Qt5Agg') # 设置 Qt 后端以提升性能
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文,解决图中无法显示中文的问题
plt.rcParams["axes.unicode_minus"] = False # 设置显示中文后,负号显示受影响。解决坐标轴上乱码问题
# 初始化数据存储
time_data = []
cpu_data, mem_data, disk_data, net_sent_data, net_recv_data = [], [], [], [], []
# 创建图表和子图
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
fig.suptitle('系统资源监控', fontsize=16)
#plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1, hspace=0.4, wspace=0.4)#如果你想要调整子图之间的间距
#axs[0,0] = fig.add_subplot(221) # CPU 使用率
#axs[0,1] = fig.add_subplot(222) # 内存使用率
#axs[1,0] = fig.add_subplot(223) # 硬盘使用率
#axs[1,1] = fig.add_subplot(224) # 网络流量
# 初始化折线图
def init():
axs[0,0].set_ylim(0, 100)
axs[0,0].set_title('CPU 使用率 (%)')
axs[0,1].set_ylim(0, 100)
axs[0,1].set_title('内存使用率 (%)')
#axs[1,0].set_ylim(0, 100)
#axs[1,0].set_title('硬盘使用率 (%)')
axs[1,0].set_ylim(0, 1000)
axs[1,0].set_title('网络流量 (MB)')
return axs[0,0],axs[0,1],axs[1,0]#axs[1,0]
# 更新函数(每秒调用)
def update(frame):
# 获取当前时间戳
#time_data.append(len(time_data))
current_timestamp = time.time()
#print("当前时间戳:", current_timestamp)
# 将时间戳转换为datetime对象
current_datetime = datetime.fromtimestamp(current_timestamp)
#print("当前时间(datetime):", current_datetime)
# 格式化datetime对象为"年-月-日 时:分:秒"的格式
formatted_datetime = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
#print("格式化后的当前时间:", formatted_datetime)
time_data.append(formatted_datetime)
# 获取 CPU 使用率
cpu_usage = psutil.cpu_percent(interval=1)
cpu_data.append(cpu_usage)
time_data_current = time_data[-1]
cpu_current = cpu_data[-1]
# 获取内存使用率
mem_usage = psutil.virtual_memory().percent
mem_data.append(mem_usage)
time_data_current = time_data[-1]
mem_current = mem_data[-1]
# 获取硬盘使用率(默认取 C 盘)
#disk_usage = psutil.disk_usage('/').percent
#disk_data.append(disk_usage)
# 获取网络流量(累计值转瞬时值)
net_io = psutil.net_io_counters()
net_sent = net_io.bytes_sent / 1024 / 1024 # 转换为 MB
net_recv = net_io.bytes_recv / 1024 / 1024
net_sent_data.append(net_sent)
net_recv_data.append(net_recv)
time_data_current = time_data[-1]
net_sent_data_current=net_sent_data[-1]
net_recv_data_current=net_recv_data[-1]
# 仅保留最近 600 秒数据
#max_length = 600
#for data in [time_data, cpu_data, mem_data, disk_data, net_sent_data, net_recv_data]:
# if len(data) > max_length:
# data.pop(0)
# 更新折线图数据
axs[0,0].clear()
axs[0,0].plot(formatted_datetime, cpu_current, 'r-')
axs[0,0].set_ylim(0, 100)
axs[0,0].set_title('CPU 使用率 (%)')
axs[0,1].clear()
axs[0,1].plot(formatted_datetime, mem_current, 'b-')
axs[0,1].set_ylim(0, 100)
axs[0,1].set_title('内存使用率 (%)')
#axs[1,0].clear()
#axs[1,0].plot(time_data, disk_data, 'g-')
#axs[1,0].set_ylim(0, 100)
#axs[1,0].set_title('硬盘使用率 (%)')
axs[1,0].clear()
axs[1,0].plot(formatted_datetime, net_sent_data_current, 'm-', label='发送')
axs[1,0].plot(formatted_datetime, net_recv_data_current, 'c-', label='接收')
axs[1,0].legend()
axs[1,0].set_title('网络流量 (MB)')
#return axs[0,0], axs[0,1], axs[1,0], #axs[1,1]
return cpu_usage,mem_usage ,(net_sent, net_recv)
# 启动动画
ani = FuncAnimation(fig, update, init_func=init, blit=True, interval=1000)
plt.tight_layout()
plt.show()```这段代码运行不了,有什么问题,如何优化