Функция по вызову окна PyQt6 не срабатывает второй раз

highlight1() - второй раз не выполняется, как исправить?

import sys
from time import sleep
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6.QtGui import QPainter, QColor, QPen
from PySide6.QtCore import Qt, QTimer


class Highlight(QMainWindow):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)

    def __init__(self, x=0, y=0, w=500, h=500, color=Qt.red, thickness=2):
        super(Highlight, self).__init__()
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.reg = self.x, self.y, self.w, self.h
        self.setAttribute(Qt.WA_NoSystemBackground, True)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setStyleSheet("background:transparent;")
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.outside_color = color
        self.thickness = thickness

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setPen(QPen(self.outside_color, self.thickness, Qt.SolidLine))
        trans = QColor(225, 100, 233)
        trans.setAlphaF(0.1)
        painter.setBrush(trans)
        painter.drawRect(*self.reg)
        painter.end()


def highlight1(reg, dur=2000, color=Qt.red):
    app1 = QApplication(sys.argv)
    window = Highlight(*reg, color=color)
    window.showFullScreen()
    QTimer.singleShot(dur, window.close)
    sys.exit(app1.exec())


if __name__ == '__main__':
    highlight1((10, 100, 600, 500), 3000, Qt.green)
    sleep(1)
    highlight1((50, 200, 500, 400), 3000, Qt.black)
    sleep(5)

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

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

PyQt/PySide — это привязка Python к набору инструментов виджетов Qt.

Метод app.exec() запускает цикл событий Qt/C++.

Метод app.exec() передает управление циклу событий Qt.
Цикл событий нужен для прослушивание событий и выполнение ответных действий.

Вам надо почитать, что такое "цикл событий", например здесь https://habr.com/ru/companies/skillfactory/articles/599599/

Один из вариантов запустить ваш код, выглядит так, как порказано ниже.
Я не совсем понимаю, что будет делать ваше приложение, но если вы хотите сделать окно заставку, то это делается не так.

import sys
#?from time import sleep
'''
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6.QtGui import QPainter, QColor, QPen
from PySide6.QtCore import Qt, QTimer
from PySide6.QtTest import QTest                         # !!! +++
'''
from PyQt5.Qt import *  
from PyQt5.QtTest import QTest                           # !!! +++


class Highlight(QMainWindow):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)

    def __init__(self, 
        x=0, y=0, w=500, h=500, 
        color=Qt.red, 
        thickness=2):
        super(Highlight, self).__init__()
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.reg = self.x, self.y, self.w, self.h
        self.setAttribute(Qt.WA_NoSystemBackground, True)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setStyleSheet("background: transparent;")
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.outside_color = color
        self.thickness = thickness

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setPen(QPen(
            self.outside_color, 
            self.thickness, 
            Qt.SolidLine))
        trans = QColor(225, 100, 233)
        trans.setAlphaF(0.4)                     # (0.1)
        painter.setBrush(trans)
        painter.drawRect(*self.reg)
        painter.end()


def highlight1(reg, dur=3000, color=Qt.red):
#-    app1 = QApplication(sys.argv)
    window = Highlight(*reg, color=color)
    window.showFullScreen()
    
#-    QTimer.singleShot(dur, window.close)
#-    sys.exit(app1.exec())

    return window                                          # !!! +++


if __name__ == '__main__':
    app = QApplication(sys.argv)                            # +++
    
    w = highlight1((10, 100, 600, 500), 3000, Qt.green)
#?    sleep(1)  # <---- это просто заморозит интерфейс на 1сек.               

    QTest.qWait(7000)                                       # !!! +++
    
    w = highlight1((50, 200, 500, 400))
#?    sleep(5)  # <---- это просто заморозит интерфейс на 5сек.

#    sys.exit(app.exec())                                    # +++
    app.exec() 
    
    print('Приложение не доберётся сюда, пока вы не выйдете '
          'и цикл событий не остановится.')                  # <---- !!!   

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

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

→ Ссылка