Pyqt 时时CPU使用情况

 

借鉴代码来自: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_())

 

效果:

 

Pyqt 时时CPU使用情况    Pyqt 时时CPU使用情况

你可能感兴趣的:(cpu)