python - 每秒更新一个小部件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_()
图像表单脚本运行
解决方案
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))