今天是实战篇章,我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。
使用的开发工具Qt Designer来开发UI界面。
十分便捷。使用起来也算比较的简单了,虽然也存在不少的BUG。
❝对所需要的控件进行拖拽式,就OK。后续会出一个简单的视频录制。
❞
第二步,就是先将实时读取代码拟定出来。正确运行了,我们在往UI上套。
❝使用Pyside6,简单的操作一波。windows上所需要用到的获取CPU数据的工具库是psutil,需要第三方下载。
❞
第三步,确定自己需要使用的Pyside6相关的模块有哪些。
不一定一下子全部知道,最起码要有一个范围的认知,知道大致需要哪些。
❝PySide6.QtCore 中 Qt, QThread, Signal
❞ ❝PySide6.QtGui 中 QPainter
❞ ❝PySide6.QtWidgets 中 QApplication, QMainWindow, QVBoxLayout, QWidget
❞ ❝PySide6.QtCharts 中 QChartView, QLineSeries, QValueAxis
❞
绘图的关键就是QtCharts
关于QtCharts的不太核心的核心代码如下:
# 创建一个图表视图 self.chart_view = QChartView() self.chart_view.setRenderHint(QPainter.Antialiasing) # 创建一个折线图 self.series = QLineSeries() self.series.setName("CPU使用率折线图") self.chart_view.chart().addSeries(self.series) # 创建一个轴 self.axis_x = QValueAxis() self.axis_x.setRange(0, 50) self.axis_x.setLabelFormat("%d") self.axis_x.setTitleText("Time") self.axis_y = QValueAxis() self.axis_y.setRange(0, 100) self.axis_y.setLabelFormat("%d%%") self.axis_y.setTitleText("Usage") # 添加轴到图表 self.chart_view.chart().addAxis(self.axis_x, Qt.AlignBottom) self.chart_view.chart().addAxis(self.axis_y, Qt.AlignLeft) self.series.attachAxis(self.axis_x) self.series.attachAxis(self.axis_y)
有了上述,基本上就可以渲染出一张图了,那么接下来就是数据来源了,从哪来,怎么来,怎么处理。
数据来源主要通过列表的形式传递。所以,我们定义一个列表来存储值。
# 初始化CPU使用率数据列表 self.cpu_usage_data = []
最后,那就是核心的玩意了,传递值并让它显示出来。
# 将数据添加到CPU使用率数据列表中 self.cpu_usage_data.append(cpu_usage) # 只保留最近50个数据点 self.cpu_usage_data = self.cpu_usage_data[-50:] # 清除折线图数据 self.series.clear() # 添加最新的数据点到折线图 for i, value in enumerate(self.cpu_usage_data): self.series.append(i, value) # 更新轴的范围 self.axis_x.setRange(0, len(self.cpu_usage_data) - 1) self.axis_y.setRange(0, max(self.cpu_usage_data)) # 更新图表视图 self.chart_view.update()
❝将数据会知道折线图中,主要还是通过循环的方式将值添加到QLineSeries中。
❞
最后绘制的效果是这样的:
我们需要做一点点修改。加上开始停止以及重置/清除的操作。如图:
使用Qt Desgner绘制起来一分钟不需要。写代码要写5-10min。
代码中我们使用了线程(非Python的threading模块,而是Pyside6的Qthread模块。)
主要用来一直用来获取数据,以及自定义型号的。自定义信号用来发送暂停开始结束以及over线程的信号。如下:
class CPUMonitorThread(QThread): cpu_data_updated = Signal(float) stop_requested = Signal() def __init__(self): super(CPUMonitorThread, self).__init__() self.paused = False self.should_stop = False # 新增标志位 def run(self): while not self.should_stop: # 检查标志位 if not self.paused: cpu_usage = psutil.cpu_percent() self.cpu_data_updated.emit(cpu_usage) self.msleep(1000) self.finished.emit() # 发出线程完成的信号 def pause(self): self.paused = True def resume(self): self.paused = False def stop(self): # 新增停止方法 self.should_stop = True self.quit()
三个按钮的信号机制
def clicked(self): self.ui.pushButton.clicked.connect(self.Chart) self.ui.pushButton_3.clicked.connect(self.clear_computer_info) self.ui.pushButton_2.clicked.connect(self.start_or_pause)
清除数据的部分的代码。主要还是要把列表中的数据给清理了。不然数据会一直存在。
def clear_computer_info(self): # 清空折线图数据和CPU使用率数据列表 if self.series: self.series.clear() self.cpu_usage_data.clear() self.axis_y = None self.chart_view.update()