Добрый день! Подскажите почему не завершается выполнение программы при вызове 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_())