借鉴代码来自:https://github.com/hgoldfish/quickpanel
实现代码:
1 # -*- coding:utf-8 -*- 2 from __future__ import print_function 3 from __future__ import unicode_literals 4 from __future__ import division 5 from __future__ import absolute_import 6 7 import ctypes, sys 8 import ctypes.wintypes 9 from PyQt4.QtCore import QPoint, QRect, QTimer, Qt 10 from PyQt4.QtGui import QPainter, QPen, QPolygon, QApplication, QWidget 11 12 GetSystemTimes = ctypes.windll.kernel32.GetSystemTimes 13 class FILETIME(ctypes.Structure): 14 _fields_ = [("dwLowDateTime", ctypes.wintypes.DWORD), ("dwHighDateTime", ctypes.wintypes.DWORD)] 15 16 def __int__(self): 17 # print(self.dwHighDateTime) 18 return self.dwHighDateTime * 0x100000000 + self.dwLowDateTime 19 class MachineLoad: 20 _instance = None 21 22 @staticmethod 23 def getInstance(): 24 if MachineLoad._instance is None: 25 MachineLoad._instance = MachineLoad() 26 return MachineLoad._instance 27 28 def __init__(self): 29 idle, kernel, user = FILETIME(), FILETIME(), FILETIME() 30 GetSystemTimes(ctypes.byref(idle), ctypes.byref(kernel), ctypes.byref(user)) 31 self.idle0, self.kernel0, self.user0 = int(idle), int(kernel), int(user) 32 33 def getLoad(self): 34 idle, kernel, user = FILETIME(), FILETIME(), FILETIME() 35 GetSystemTimes(ctypes.byref(idle), ctypes.byref(kernel), ctypes.byref(user)) 36 idle1, kernel1, user1 = int(idle), int(kernel), int(user) 37 a, b, c = idle1 - self.idle0, kernel1 - self.kernel0, user1 - self.user0 38 self.idle0, self.kernel0, self.user0 = idle1, kernel1, user1 39 if (b + c) == 0: 40 return 1 41 return (b + c - a) / (b + c) 42 43 class MachineLoadWidget(QWidget): 44 def __init__(self, parent): 45 QWidget.__init__(self, parent) 46 self.timer = QTimer() 47 self.timer.timeout.connect(self.collectMachineLoad) 48 self.loads = [] 49 self.maxLength = 400 50 self.pointDistance = 5 #每点之间的间隔 51 self.updateInterval = 500 #更新的时间间隔 52 self.timer.setInterval(self.updateInterval) 53 self.timer.start() 54 self.machineLoad = MachineLoad.getInstance() 55 self.boxWidth = 60 56 57 def collectMachineLoad(self): 58 rate = self.machineLoad.getLoad() 59 self.loads.insert(0, rate) 60 if len(self.loads) > self.maxLength: 61 self.loads.pop(- 1) 62 if self.isVisible(): 63 self.update() 64 65 def paintEvent(self, event): 66 QWidget.paintEvent(self, event) 67 width, height = self.width(), self.height() 68 polygon = QPolygon() 69 for i, rate in enumerate(self.loads): 70 x = width - i * self.pointDistance 71 y = height - rate * height 72 if x < self.boxWidth: 73 break 74 polygon.append(QPoint(x, y)) 75 painter = QPainter(self) 76 pen = QPen() 77 pen.setColor(Qt.darkGreen) 78 painter.setPen(pen) 79 painter.setRenderHint(QPainter.Antialiasing, True) 80 #画网格 81 painter.setOpacity(0.5) 82 gridSize = self.pointDistance * 4 83 deltaX = (width - self.boxWidth) % gridSize + self.boxWidth 84 deltaY = height % gridSize 85 for i in range(int(width / gridSize)): 86 x = deltaX + gridSize * i 87 painter.drawLine(x, 0, x, height) 88 for j in range(int(height / gridSize)): 89 y = j * gridSize + deltaY 90 painter.drawLine(self.boxWidth, y, width, y) 91 #画折线 92 pen.setColor(Qt.darkCyan) 93 pen.setWidth(2) 94 painter.setPen(pen) 95 painter.setOpacity(1) 96 painter.drawPolyline(polygon) 97 #画展示框 98 if len(self.loads) > 0: 99 rate = self.loads[0] 100 else: 101 rate = 1.0 102 rect1 = QRect(4, height * 0.05, self.boxWidth - 9, height * 0.7) 103 rect2 = QRect(4, height * 0.8, self.boxWidth - 9, height * 0.2) 104 centerX = int(rect1.width() / 2) + 1 105 pen.setWidth(1) 106 for i in range(rect1.height()): 107 if i % 4 == 0: 108 continue 109 if (rect1.height() - i) / rect1.height() > rate: 110 pen.setColor(Qt.darkGreen) 111 else: 112 pen.setColor(Qt.green) 113 painter.setPen(pen) 114 for j in range(rect1.width()): 115 if centerX - 1 <= j <= centerX + 1: 116 continue 117 painter.drawPoint(rect1.x() + j, rect1.y() + i) 118 pen.setColor(Qt.black) 119 painter.setPen(pen) 120 painter.drawText(rect2, Qt.AlignHCenter | Qt.AlignVCenter, str(int(rate * 100)) + "%") 121 122 123 124 class CPUstatus(QWidget): 125 def __init__(self): 126 super(CPUstatus, self).__init__() 127 self.resize(200,200) 128 self.factory = MachineLoadWidget(self) 129 self.factory.resize(200, 200) 130 131 132 if __name__ == "__main__": 133 app = QApplication(sys.argv) 134 platform = CPUstatus() 135 platform.show() 136 sys.exit(app.exec_())
效果: