PC_Monitor/main.py
2025-04-27 18:10:04 +08:00

127 lines
4.6 KiB
Python

import datetime
import sys
import psutil
import wmi
from PySide6 import QtCharts
from PySide6.QtCore import QDateTime, QTimer
from PySide6.QtGui import Qt
from PySide6.QtWidgets import QWidget, QApplication
from PC_Monitor import Ui_PC_Monitor
import win32com.client
def get_total_thread_count_pywin32():
"""使用 pywin32 获取系统总线程数"""
wmi = win32com.client.GetObject("winmgmts:")
processes = wmi.InstancesOf("Win32_Process")
return sum(int(p.Properties_("ThreadCount").Value) for p in processes)
def get_total_handle_count():
"""获取系统中所有进程的句柄总数"""
total_handles = 0
for proc in psutil.process_iter(['pid', 'name', 'num_handles']):
try:
total_handles += proc.info['num_handles']
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
return total_handles
class MyWindow(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.c = wmi.WMI()
self.ui = Ui_PC_Monitor() # 创建UI对象
self.ui.setupUi(self) # 构造UI界面
self.create_chart()
self.set_timer()
self.setWindowTitle("电脑系统监控")
def create_chart(self):
self.chart = QtCharts.QChart()
self.series = QtCharts.QLineSeries()
self.chart.addSeries(self.series)
self.chart.legend().hide()
#设置坐标轴显示范围
self.data_axisX = QtCharts.QDateTimeAxis()
self.value_axisY = QtCharts.QValueAxis()
self.limitminute = 1 #设置显示多少分钟内活动
self.maxspeed = 100 # 预设y轴最大值
#Returns a QDateTime object containing a datetime a seconds later than the datetime of this object (or earlier if s is negative).
self.data_axisX.setMin(QDateTime.currentDateTime().addSecs(-self.limitminute*60))
self.data_axisX.setMax(QDateTime.currentDateTime().addSecs(0))
self.value_axisY.setMin(0)
self.value_axisY.setMax(self.maxspeed)
self.data_axisX.setFormat("hh:mm:ss")
#把坐标轴添加到 chart 中
self.chart.addAxis(self.data_axisX,Qt.AlignmentFlag.AlignBottom)
self.chart.addAxis(self.value_axisY,Qt.AlignmentFlag.AlignLeft)
# 把曲线关联到坐标轴
self.series.attachAxis(self.data_axisX)
self.series.attachAxis(self.value_axisY)
self.ui.graphicsView.setChart(self.chart)
# 获取cpu分级缓存(暂无法获取L1缓存)
self.ui.cpu_L2_cache_value.setText(str(self.c.Win32_Processor()[0].L2CacheSize / 1024)+' MB')
self.ui.cpu_L3_cache_value.setText(str(self.c.Win32_Processor()[0].L3CacheSize / 1024)+' MB')
cpufreq = psutil.cpu_freq()
# 获取cpu内核数
self.ui.cpu_kernel_value.setText(str(psutil.cpu_count(logical=False)))
# 获取cpu逻辑处理器数量
self.ui.cpu_logicprocessor_value.setText(str(psutil.cpu_count(logical=True)))
# 获取cpu基准速度
self.ui.cpu_basespeed_value.setText(str('%.2f'% (cpufreq.current/1000))+' GHz')
# 获取cpu名称
self.ui.cpu_name.setText(str(self.c.Win32_Processor()[0].Name))
# 定时
def set_timer(self):
self.timer = QTimer(self)
self.timer.timeout.connect(self.cpuLoad)
self.timer.start(1000) # 每隔1000毫秒出一个点
def cpuLoad(self):
current_time = QDateTime.currentDateTime()
self.data_axisX.setMin(current_time.addSecs(-self.limitminute*60))
self.data_axisX.setMax(current_time.addSecs(0))
cpuload = psutil.cpu_percent()
self.series.append(current_time.toMSecsSinceEpoch(),cpuload)
if self.series.at(0):
# 图表更新
# Returns the datetime as the number of milliseconds that have passed since 1970-01-01T00:00:00.000,Coordinated Universal Time(UTC)
if self.series.at(0).x()<current_time.addSecs(-self.limitminute*60).toMSecsSinceEpoch():
self.series.remove(0)
# 获取cpu利用率
self.ui.cpu_percent_value.setText(str(cpuload)+'%')
# 获取正常运行时间(无效)
self.ui.cpu_runningtime_value.setText(str(datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%d:%H:%M:%S")))
# 获取进程数
self.ui.cpu_process_value.setText(str(len(psutil.pids())))
# 获取线程数
self.ui.cpu_thread_value.setText(str(get_total_thread_count_pywin32()))
#获取句柄数
self.ui.cpu_handle_value.setText(str(get_total_handle_count()))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())