每秒更新一个小部件 pyqt5

问题描述

我有一个关于如何在不先擦除的情况下每秒(或更多)更新一个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))