Функция по вызову окна 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('Приложение не доберётся сюда, пока вы не выйдете '
'и цикл событий не остановится.') # <---- !!!

