问题描述
我有一个关于如何在不先擦除的情况下每秒(或更多)更新一个paintEvent 的问题。它是一个显示实时 cpu 使用率的小部件(不只是完成了圆形条,它将具有用于百分比的颜色)。关于如何改进我的代码的建议也总是受欢迎的:)。 PS:如果你想要更好的外观,代码没有正确解决这个问题,只需从第一个输入一直复制粘贴
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import pyautogui
import sys
import psutil
class cpu(QWidget):
def __init__(self):
super().__init__()
screenwidth,screenheight = pyautogui.size()
Systemheight = screenheight * 0.652
WH = int(Systemheight * 0.32)
self.setGeometry(0,int(WH+25),int(WH+25))
def paintEvent(self,event):
painter = QPainter(self)
pen = QPen(QColor(50,225,255,200),12.5)
pen.setDashPattern([0.001,1.1])
painter.setPen(pen)
screenwidth,screenheight = pyautogui.size()
Systemheight = screenheight * 0.652
WH = int(Systemheight * 0.32)
cpu = psutil.cpu_percent()
cpuAngle = (cpu / 100) * 5760
A1 = 0
A2 = int(cpuAngle)
A3 = int(cpuAngle + 50)
A4 = int(5710 - cpuAngle)
print(cpuAngle)
painter.drawArc(12.5,12.5,WH,A1,A2)
pen = QPen(QColor(30,75,75),1.1])
painter.setPen(pen)
painter.drawArc(12.5,A3,A4)
pen = QPen(QColor(0,0),12.5)
painter.setPen(pen)
painter.drawEllipse(15,15,int(WH-6.5),int(WH-6.5))
app = QApplication(sys.argv)
window = cpu()
window.show()
sys.exit(app.exec_()
图片表单脚本运行
解决方法
paintEvent 总是清除之前的绘制。
另一方面,通常的逻辑是创建一个变量来存储用于绘画的信息,然后调用 update()
(或 repaint()
)方法,以便调用paintEvent 更新绘画。并且由于您希望读取是周期性的,因此您必须使用 QTimer。
class CPU(QWidget):
def __init__(self):
super().__init__()
screenwidth,screenheight = pyautogui.size()
Systemheight = screenheight * 0.652
WH = int(Systemheight * 0.32)
self.setGeometry(0,int(WH + 25),int(WH + 25))
self._percentage = 0
timer = QTimer(self,interval=1000,timeout=self.handle_timeout)
timer.start()
self.handle_timeout()
@property
def percentage(self):
return self._percentage
def handle_timeout(self):
self._percentage = psutil.cpu_percent()
self.update()
def paintEvent(self,event):
painter = QPainter(self)
pen = QPen(QColor(50,225,255,200),12.5)
pen.setDashPattern([0.001,1.1])
painter.setPen(pen)
screenwidth,screenheight = pyautogui.size()
Systemheight = screenheight * 0.652
WH = int(Systemheight * 0.32)
CPUAngle = (self.percentage / 100) * 5760
A1 = 0
A2 = int(CPUAngle)
A3 = int(CPUAngle + 50)
A4 = int(5710 - CPUAngle)
print(CPUAngle)
painter.drawArc(12.5,12.5,WH,A1,A2)
pen = QPen(QColor(30,75,75),1.1])
painter.setPen(pen)
painter.drawArc(12.5,A3,A4)
pen = QPen(QColor(0,0),12.5)
painter.setPen(pen)
painter.drawEllipse(15,15,int(WH - 6.5),int(WH - 6.5))