首页 > 解决方案 > 每秒更新一个小部件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, 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, WH, A1, A2)

        pen = QPen(QColor(30, 75, 255, 75), 12.5)
        pen.setDashPattern([0.001, 1.1])
        painter.setPen(pen)
        painter.drawArc(12.5, 12.5, WH, WH, A3, A4)

        pen = QPen(QColor(0, 0, 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_()

图像表单脚本运行

标签: pythonpyqt5paintevent

解决方案


paintEvent 总是清除以前的绘画。

另一方面,一般的逻辑是创建一个变量来存储用于绘画的信息,然后调用update()(or 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, 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, WH, A1, A2)

        pen = QPen(QColor(30, 75, 255, 75), 12.5)
        pen.setDashPattern([0.001, 1.1])
        painter.setPen(pen)
        painter.drawArc(12.5, 12.5, WH, WH, A3, A4)

        pen = QPen(QColor(0, 0, 0, 0), 12.5)
        painter.setPen(pen)
        painter.drawEllipse(15, 15, int(WH - 6.5), int(WH - 6.5))

推荐阅读