Не правильно работает код pyqt5, маленькая ошибка

У меня есть код, на форуме нашёл вопрос с анимацией listwidget, я сделал так-же и попробовал сделать получение бонуса.

Все работает. То есть, открывается главное окно, нажимаем Бонус в listwidget, открывается новое окно, там мы можем получить рандом бонус.

Но проблема в том что можно получиться бонус и закрыть это окно, но потом если в главном окне опять нажав на бонус в listwidget, то можно получить бонус еще раз.

Как это исправить?

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import random
from PyQt5.Qt import *

from random import randint
import contextlib
import threading

class Ui_MainWindow_bonus(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(565, 456)
MainWindow.setStyleSheet("background-color: rgb(106, 106, 106);")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(130, 230, 291, 71))
font = QtGui.QFont()
font.setPointSize(17)
self.pushButton.setFont(font)
self.pushButton.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"border-radius: 10px;")
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "БОНУС"))



class BonusApp(QtWidgets.QMainWindow, Ui_MainWindow_bonus):
def __init__(self, parent_1): # + parent
super().__init__()
self.setupUi(self)
# +++

self.parent_1 = parent_1 # + parent

self.pushButton.clicked.connect(self.onClicked)

self.start = QPoint(0, 0)
self.pressing = False
# +++
self.bonus_point = 0 # +++ <-—

self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.updtTime)
self.testTimeDisplay = QtWidgets.QLCDNumber(self)
self.testTimeDisplay.setFixedSize(0.1, 0.1)
self.testTimeDisplay.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
self.testTimeDisplay.setDigitCount(8)

self.dt = QtCore.QDateTime.currentDateTime().addDays(1)
self.fl = True
self.sec = ...
self.updtTime()
self.timer.start(1000)

def myClose(self):
self.close()

def myMinimize(self):
self.showMinimized()

def onClicked(self):
if self.fl:
# +++
# self.bonus_point = random.randint(1, 5)
self.bonus_point = random.uniform(1, 5.5) # float

self.BonusGet()
self.dt = QtCore.QDateTime.currentDateTime().addSecs(1*60*60*24) #0*60*24) # 1 мин = 60 сек
# self.dt = QtCore.QDateTime.currentDateTime().addSecs(1*60*60*24) # раз в 24 часа

self.fl = False
self.sec = 0
else:
self.flashSplash()

def updtTime(self):
currentTime = QtCore.QDateTime.currentDateTime().toString('hh:mm:ss')
self.testTimeDisplay.display(currentTime)

# QDateTime::secsTo(const QDateTime &other) const
# Возвращает количество секунд от этой даты до другой даты.
# Если другой datetime раньше, чем this date, возвращаемое значение будет отрицательным.

self.sec = QtCore.QDateTime.currentDateTime().secsTo(self.dt)
if self.sec <= 0:
self.fl = True


def flashSplash(self):
# Обязательно сохраните ссылку на SplashScreen иначе это будет мусор
self.splash = QtWidgets.QSplashScreen(QtGui.QPixmap('').scaled(382, 72, QtCore.Qt.KeepAspectRatio))
self.splash.move(755, 680) # width()
self.splash.show()
self.splash.showMessage(
'<h2 style="color:white; font: Arial">Бонус будет доступен через {} секунд</h2>'.format(self.sec),
QtCore.Qt.AlignCenter, QtCore.Qt.white)# | QtCore.Qt.AlignHCenter, QtCore.Qt.white)

# Закройте SplashScreen через 5 секунды (5000 мс)
QtCore.QTimer.singleShot(2200, self.splash.close)

def BonusGet(self):
# Обязательно сохраните ссылку на SplashScreen иначе это будет мусор
self.splash = QtWidgets.QSplashScreen(QtGui.QPixmap('').scaled(382, 72,

QtCore.Qt.KeepAspectRatio))
self.splash.move(755, 680) # width()
self.splash.show()
self.splash.showMessage(

# '<h2 style="color:white; font: Arial">Вы получили ??????????? пунктов</h2>'.format(self.sec),
# +++
'<h2 style="color:white; font: Arial">Вы получили {:.2f} </h2>'.format(self.bonus_point),

QtCore.Qt.AlignCenter, QtCore.Qt.white)# | QtCore.Qt.AlignHCenter, QtCore.Qt.white)

# Закройте SplashScreen через 5 секунды (5000 мс)
QtCore.QTimer.singleShot(775, self.splash.close)
# +++
# self.parent.label_2.setNum(int(self.parent.label_2.text()) + self.bonus_point)
self.parent_1.label.setText(
str(round(float(self.parent_1.label.text()) + self.bonus_point, 2))) # float

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(565, 456)
MainWindow.setStyleSheet("background-color: rgb(106, 106, 106);")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(0, 0, 41, 31))
self.pushButton.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"border-radius: 1px;")
self.pushButton.setText("")
self.pushButton.setObjectName("pushButton")
self.pushButton.raise_()
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(110, 370, 331, 81))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(50)
self.label.setFont(font)
self.label.setStyleSheet("color: rgb(255, 255, 255);")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(0, 0, 561, 451))
self.frame.setStyleSheet("background-color: transparent;")
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.frame2 = QtWidgets.QFrame(self.frame)
self.frame2.setGeometry(QtCore.QRect(0, 0, 181, 451))
self.frame2.setStyleSheet("background-color: transparent;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "0"))

class ListWidget(QtWidgets.QListWidget):
def itClicked(self, item):
QtWidgets.QMessageBox.information(
None,
"ListWidget",
"Вы нажали: {}".format(item.text())
)

class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()

self.setupUi(self)

self.pushButton.setCheckable(True)
self.pushButton.click()
self.pushButton.installEventFilter(self)

self.listWidget = ListWidget()
self.listWidget.insertItem(0, "Бонус")

self.listWidget.itemClicked.connect(self.openWindow)

self.listWidget.setFrameShape(QtWidgets.QFrame.NoFrame)
self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.listWidget.setFont (QFont ("Arial", 22));
self.listWidget.setStyleSheet("QListWidget::item:hover {background: rgba(158, 158, 158, 40);}\n"
"QListWidget::item:selected {background: transparent;}\n"
"QListWidget::item:selected {color: black;}\n"
"")

lay = QtWidgets.QVBoxLayout(self.frame2)
lay.addWidget(self.listWidget)
lay.setContentsMargins(0, 30, 0, 0)

self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(0, self.height()))
self._animation.setEndValue(QtCore.QSize(320, self.height()))
self._animation.setDuration(200)

def eventFilter(self, watched, event):
if self.pushButton

is watched:
if event.type() == 2 and self.pushButton.isChecked():
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
if event.type() == 2 and (not self.pushButton.isChecked()):
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super(ExampleApp,self).eventFilter(watched, event)


def openWindow(self, item):
self.widget = QtWidgets.QWidget()

if item.text() == "Бонус":
self.exampleApp = BonusApp(self)
self.exampleApp.show()


if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())

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

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

Беда в том, что вы все время пере создаете self.exampleApp = BonusApp(self), я его вынес в конструктор и в метод добавил проверку if self.exampleApp.fl:.

Обратите внимание, что я поставил свои картинки и обратите внимание на строки ниже пометок #??? и сделайте как вам надо.

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

from random import randint
import contextlib
import threading

class Ui_MainWindow_bonus(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(565, 456)
        MainWindow.setStyleSheet("background-color: rgb(106, 106, 106);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(130, 230, 291, 71))
        font = QtGui.QFont()
        font.setPointSize(17)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("background-color: rgb(255, 255, 255);\n"
        "border-radius: 10px;")
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "БОНУС"))


class BonusApp(QtWidgets.QMainWindow, Ui_MainWindow_bonus):
    def __init__(self, parent_1): 
        super().__init__()
        self.setupUi(self)
        self.parent_1 = parent_1 
        self.pushButton.clicked.connect(self.onClicked)
        self.start = QPoint(0, 0)
        self.pressing = False
        self.bonus_point = 0 

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.updtTime)
        self.testTimeDisplay = QtWidgets.QLCDNumber(self)
        self.testTimeDisplay.setFixedSize(0.1, 0.1)
        self.testTimeDisplay.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
        self.testTimeDisplay.setDigitCount(8)

        self.dt = QtCore.QDateTime.currentDateTime().addDays(1)
        self.fl = True
        self.sec = ...
        self.updtTime()
        self.timer.start(1000)

    def myClose(self):
        self.close()

    def myMinimize(self):
        self.showMinimized()

    def onClicked(self):
        if self.fl:
            self.bonus_point = random.uniform(1, 5.5) # float
            self.BonusGet()
            self.dt = QtCore.QDateTime.currentDateTime().addSecs(1*60*60*24) #0*60*24) # 1 мин = 60 сек
            # self.dt = QtCore.QDateTime.currentDateTime().addSecs(1*60*60*24) # раз в 24 часа
            self.fl = False
            self.sec = 0
        else:
            self.flashSplash()

    def updtTime(self):
        currentTime = QtCore.QDateTime.currentDateTime().toString('hh:mm:ss')
        self.testTimeDisplay.display(currentTime)

        # QDateTime::secsTo(const QDateTime &other) const
        # Возвращает количество секунд от этой даты до другой даты.
        # Если другой datetime раньше, чем this date, возвращаемое значение будет отрицательным.

        self.sec = QtCore.QDateTime.currentDateTime().secsTo(self.dt)
        if self.sec <= 0:
            self.fl = True

    def flashSplash(self):
        # Обязательно сохраните ссылку на SplashScreen иначе это будет мусор
        self.splash = QtWidgets.QSplashScreen(QtGui.QPixmap('mask.png').scaled(
                                      382, 72))           #, QtCore.Qt.KeepAspectRatio))
        self.splash.move(755, 480) # width() 680
        self.splash.show()
#???
        self.splash.showMessage(
        '<h2 style="color:white; font: Arial">Бонус будет доступен через {} секунд</h2>'.format(self.sec),
        QtCore.Qt.AlignCenter, QtCore.Qt.white)# | QtCore.Qt.AlignHCenter, QtCore.Qt.white)

        # Закройте SplashScreen через 5 секунды (5000 мс)
        QtCore.QTimer.singleShot(2200, self.splash.close)

    def BonusGet(self):
        # Обязательно сохраните ссылку на SplashScreen иначе это будет мусор
#???
        self.splash = QtWidgets.QSplashScreen(QtGui.QPixmap('mask.png').scaled(
                                           382, 72))             #, QtCore.Qt.KeepAspectRatio)) 
        self.splash.move(755, 480) # width() 680
        self.splash.show()
        self.splash.showMessage(

        # '<h2 style="color:white; font: Arial">Вы получили ??????????? пунктов</h2>'.format(self.sec),
        '<h2 style="color:white; font: Arial">Вы получили {:.2f} </h2>'.format(self.bonus_point),

        QtCore.Qt.AlignCenter, QtCore.Qt.white)# | QtCore.Qt.AlignHCenter, QtCore.Qt.white)

        # Закройте SplashScreen через 5 секунды (5000 мс)
        QtCore.QTimer.singleShot(775, self.splash.close)
        # self.parent.label_2.setNum(int(self.parent.label_2.text()) + self.bonus_point)
        self.parent_1.label.setText(
        str(round(float(self.parent_1.label.text()) + self.bonus_point, 2))) # float

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(565, 456)
        MainWindow.setStyleSheet("background-color: rgb(106, 106, 106);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(0, 0, 41, 31))
        self.pushButton.setStyleSheet("background-color: rgb(255, 255, 255);\n"
        "border-radius: 1px;")
        self.pushButton.setText("")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.raise_()
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(110, 370, 331, 81))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(50)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(255, 255, 255);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 561, 451))
        self.frame.setStyleSheet("background-color: transparent;")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.frame2 = QtWidgets.QFrame(self.frame)
        self.frame2.setGeometry(QtCore.QRect(0, 0, 181, 451))
        self.frame2.setStyleSheet("background-color: transparent;")
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "0"))


class ListWidget(QtWidgets.QListWidget):
    def itClicked(self, item):
        QtWidgets.QMessageBox.information(
        None,
        "ListWidget",
        "Вы нажали: {}".format(item.text())
        )

class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.setCheckable(True)
        self.pushButton.click()
        self.pushButton.installEventFilter(self)
        self.listWidget = ListWidget()
        self.listWidget.insertItem(0, "Бонус")
        self.listWidget.itemClicked.connect(self.openWindow)
        self.listWidget.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.listWidget.setFont (QFont ("Arial", 22));
        self.listWidget.setStyleSheet("QListWidget::item:hover {background: rgba(158, 158, 158, 40);}\n"
        "QListWidget::item:selected {background: transparent;}\n"
        "QListWidget::item:selected {color: black;}\n"
        "")

        lay = QtWidgets.QVBoxLayout(self.frame2)
        lay.addWidget(self.listWidget)
        lay.setContentsMargins(0, 30, 0, 0)

        self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
        self._animation.setStartValue(QtCore.QSize(0, self.height()))
        self._animation.setEndValue(QtCore.QSize(320, self.height()))
        self._animation.setDuration(200)
# +++    
        self.exampleApp = BonusApp(self)                     # <<<<<<<<=========<<<
# +++

    def eventFilter(self, watched, event):
        if self.pushButton is watched:
            if event.type() == 2 and self.pushButton.isChecked():
                self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
                self._animation.start()
            if event.type() == 2 and (not self.pushButton.isChecked()):
                self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
                self._animation.start()

        return super(ExampleApp,self).eventFilter(watched, event)


    def openWindow(self, item):
        self.widget = QtWidgets.QWidget()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if item.text() == "Бонус":
#            self.exampleApp = BonusApp(self)                     # -
            if self.exampleApp.fl:                                # +
                self.exampleApp.show()
            else:
                self.exampleApp.flashSplash()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^            

if __name__=="__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = ExampleApp()
    window.show()
    sys.exit(app.exec_())

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

→ Ссылка