Зависает и закрывается приложение при добавлении функции update()

При добавлении функции self.update() зависает и почти сразу же закрывается приложение.

Эта функция нужна для перерисовки места положения квадратов в будущем

from typing import Sized
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QRadialGradient, QPainter, QPainterPath, QPen, QBrush, QGradient, QColor
from PyQt5.QtCore import QPointF, Qt, QRect
import sys
import time

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        self.resize(600, 400)

       
    def paintEvent(self, event):
        self.painter = QPainter(self)
        
        radialGrad = QRadialGradient(QPointF(300, 450), 200)
        
        radialGrad.setColorAt(0, QColor('#1B2735'))
        radialGrad.setColorAt(1, QColor('#090A0F'))

        self.painter.setBrush(radialGrad)
        self.painter.drawRect(0, 0, 600, 400) 

        self.painter.setBrush(QBrush(Qt.white))

        self.painter.drawRect(100, 390, 2, 2) 
        self.painter.drawRect(200, 390, 3, 3) 
        self.painter.drawRect(300, 390, 4, 4)
        self.update()
        time.sleep(1)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Замкните все self.painter на painter

Нельзя использовать time.sleep(1) - это блокирует интерфейс.

Нельзя использовать self.update() в методе paintEvent().
update() используется вне этого метода и для того чтобы вызвать этот метод paintEvent().

import sys
from typing import Sized
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QRadialGradient, QPainter, QPainterPath, QPen, QBrush, QGradient, QColor
from PyQt5.QtCore import QPointF, Qt, QRect

#import time


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        self.resize(600, 400)
       
    def paintEvent(self, event):
#        self.painter = QPainter(self)
        painter = QPainter(self)
        
        radialGrad = QRadialGradient(QPointF(300, 450), 200)
        
        radialGrad.setColorAt(0, QColor('#1B2735'))
        radialGrad.setColorAt(1, QColor('#090A0F'))

        painter.setBrush(radialGrad)
        painter.drawRect(0, 0, 600, 400) 

        painter.setBrush(QBrush(Qt.white))

        painter.drawRect(100, 390, 2, 2) 
        painter.drawRect(200, 390, 3, 3) 
        painter.drawRect(300, 390, 4, 4)

#        self.update()
#        time.sleep(1)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка