Форум сайта python.su
Добрый день! Подскажите почему не завершается выполнение программы при вызове hide? Как это можно сделать?
# This Python file uses the following encoding: utf-8 import sys import os from PySide2.QtWidgets import QWidget, QLabel, QGridLayout, QApplication from PySide2.QtCore import QTimer, QPropertyAnimation, Qt, QRect from PySide2.QtGui import QPainter, QBrush, QColor, QBackingStore class Info(QWidget): def __init__(self, text = "", parent = None): super().__init__(parent) self.text = text self.label = QLabel(text) # Label с сообщением self.adjustSize() self.layout = QGridLayout() # Размещение для лейбла self.animation = QPropertyAnimation(self) # Свойство анимации для всплывающего сообщения # Свойства полупрозрачности виджета self.timer = QTimer() # Таймер, по которому виджет будет скрыт self.setWindowFlags(Qt.FramelessWindowHint | # Отключаем оформление окна Qt.Tool | # Отменяем показ в качестве отдельного окна Qt.WindowStaysOnTopHint) # Устанавливаем поверх всех окон self.setAttribute(Qt.WA_TranslucentBackground) # Указываем, что фон будет прозрачным self.setAttribute(Qt.WA_ShowWithoutActivating) # При показе, виджет не получается фокуса автоматически self.animation.setTargetObject(self) # Устанавливаем целевой объект анимации self.animation.setPropertyName(b'windowOpacity') # Устанавливаем анимируемое свойство #self.animation.stateChanged.connect(self.hide()) # Подключаем сигнал окончания анимации к слоты скрытия #connect(&animation, &QAbstractAnimation::finished, this, &PopUp::hide); # Настройка текста уведомления self.label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) # Устанавливаем по центру # И настраиваем стили self.label.setStyleSheet("QLabel { color : white; " "margin-top: 6px;" "margin-bottom: 6px;" "margin-left: 10px;" "margin-right: 10px; }") # Производим установку текста в размещение, ... self.layout.addWidget(self.label, 0, 0) self.setLayout(self.layout) # которое помещаем в виджет # По сигналу таймера будет произведено скрытие уведомления, если оно видимо #self.timer = QTimer() self.timer.timeout.connect(self.hideAnimation) #connect(timer, &QTimer::timeout, this, &PopUp::hideAnimation); #@property #def popupOpacity(self): # return self._popupOpacity #@popupOpacity.setter #def popupOpacity(self, opacity): # self._popupOpacity = opacity # self.setWindowOpacity(opacity) def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) # Включаем сглаживание # Подготавливаем фон. rect() возвращает внутреннюю геометрию виджета уведомления, по содержимому roundedRect = QRect() roundedRect.setX(self.rect().x() + 5) roundedRect.setY(self.rect().y() + 5) roundedRect.setWidth(self.rect().width() - 10) roundedRect.setHeight(self.rect().height() - 10) # Кисть настраиваем на чёрный цвет в режиме полупрозрачности 180 из 255 painter.setBrush(QBrush(QColor(0,0,0,180))) painter.setPen(Qt.NoPen) # Край уведомления не будет выделен # Отрисовываем фон с закруглением краёв в 10px painter.drawRoundedRect(roundedRect, 10, 10) def setPopupText(self, text): self.label.setText(text) # Устанавливаем текст в Label self.adjustSize() # С пересчётом размеров уведомления def show(self): self.setWindowOpacity(0.0) # Устанавливаем прозрачность в ноль self.animation.setDuration(150) # Настраиваем длительность анимации self.animation.setStartValue(0.0) # Стартовое значение будет 0 (полностью прозрачный виджет) self.animation.setEndValue(1.0) # Конечное - полностью непрозрачный виджет self.setGeometry(QApplication.desktop().availableGeometry().width() - 36 - self.width() + QApplication.desktop().availableGeometry().x(), QApplication.desktop().availableGeometry().height() - 36 - self.height() + QApplication.desktop().availableGeometry().y(), self.width(), self.height()) QWidget.show(self) # Отображаем виджет, который полностью прозрачен self.animation.start() # И запускаем анимацию self.timer.start(3000) # А также стартуем таймер, который запустит скрытие уведомления через 3 секунды def hideAnimation(self): self.timer.stop() # Останавливаем таймер self.timer.timeout.disconnect(self.hideAnimation) self.animation.setDuration(100) # Настраиваем длительность анимации self.animation.setStartValue(1.0) # Стартовое значение будет 1 (полностью непрозрачный виджет) self.animation.setEndValue(0.0) # Конечное - полностью прозрачный виджет self.timer.timeout.connect(self.hide) self.timer.start(3000) self.animation.start() # И запускаем анимацию def hide(self): # Если виджет прозрачный, то скрываем его print('hide') #QWidget.show(self) self.timer.stop() self.animation.stop() self.close() def __repr__(self): return 'Info class' if __name__ == "__main__": # app disexec теперь на pyqt app = QApplication(sys.argv) app.setStyle('Fusion') window = Info("This works fine") window.show() sys.exit(app.exec_())
Отредактировано KULINAR847 (Июнь 20, 2020 21:51:55)
Офлайн
Не пользовался PySide2, но может нужно не окно закрывать (не только), а приложение?
Офлайн