Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2020 16:21:46

KULINAR847
Зарегистрирован: 2019-09-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Не завершается выполнение [pyside2]

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

Офлайн

#2 Июнь 27, 2020 06:17:23

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Не завершается выполнение [pyside2]

Не пользовался PySide2, но может нужно не окно закрывать (не только), а приложение?

  • QApplication.quit()
  • или app.quit()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version