Как добавить несколько lambda функций для кнопок в PyQt6

Рейтинг: 1Ответов: 1Опубликовано: 14.08.2023

Я пишу программу на PyQt6 и мне нужно прописать код для кнопки.
Я использую lambda функции для отклика кнопки. т.е. мне нужно сделать так, чтобы при нажатии кнопки очищались ВСЕ (включая и центральный виджет) виджеты и добавлялись другие.
В моем же коде убирается только сама кнопка и надпись сверху, а задний фон остается

Если вкратце мне нужно сделать так, чтобы при нажатии кнопки очищались все виджеты, включая задний фон (либо же он менялся на другой) и добавлялись другие.

main.py:

import sys
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget


class EnterOrRegister(QWidget):
    def __init__(self):
        super().__init__()

        self.select_enter_register = QtWidgets.QLabel(self)
        self.select_enter_register.setObjectName("select_enter_register")
        self.select_enter_register.setText("Enter or register")
        self.select_enter_register.setWordWrap(False)
        self.select_enter_register.setAlignment(
            QtCore.Qt.AlignmentFlag.AlignCenter
            )
        self.select_enter_register.adjustSize()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.select_enter_register)


class QuizApplication(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Quiz Application")
        self.setGeometry(300, 50, 645, 500)

        self.welcome_label = QtWidgets.QLabel(self)
        self.welcome_label.setObjectName("welcome_label")
        self.welcome_label.setText("Welcome to Marathon Battle!")
        self.welcome_label.setWordWrap(False)
        self.welcome_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)

        self.start_button = QtWidgets.QPushButton(self)
        self.start_button.setObjectName("start_button")
        self.start_button.setText("Start Quiz")
        self.start_button.adjustSize()

        self.quiz_QVBlayout = QtWidgets.QVBoxLayout(self)
        self.quiz_QVBlayout.addWidget(
            self.welcome_label,
            alignment=QtCore.Qt.AlignmentFlag.AlignTop
        )
        self.quiz_QVBlayout.addWidget(
            self.start_button,
            alignment=QtCore.Qt.AlignmentFlag.AlignBottom
        )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Quiz Application")
        self.setGeometry(300, 50, 645, 500)

        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.quizApplication = QuizApplication()
        self.enterOrRegister = EnterOrRegister()

        self.stack = QtWidgets.QStackedWidget(self)
        self.ix_stack_1 = self.stack.addWidget(self.quizApplication)
        ix_stack_2 = self.stack.addWidget(self.enterOrRegister)

        self.QVBlayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.QVBlayout.addWidget(self.stack)

        self.quizApplication.start_button.clicked.connect(
            lambda: self.stack.setCurrentIndex(ix_stack_2)
        )


StyleSheet = """
#centralwidget {
    border-image: url(images/battle_images/battle-of-marathon-war.jpg)"\
    "0 0 0 0 stretch stretch;
}
#welcome_label {
    font-size: 23px;
}
#start_button {
    font-size: 20px;
    color: #ADFF2F;
    background-color: #008000;
}
#select_enter_register {
    font-size: 21px;
    color: #00FA9A;
    background-color: rgba(220, 0, 0, 70);
    border: 2px solid #f9009B;
    border-radius: 22px;
    min-width:  296px;
    min-height: 196px;
    max-width:  400px;
    max-height: 300px;
}
#instructional_label {
    font-size: 20px;
    color: rgba(135, 155, 200, 226);
}
"""


def application_setup():
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    application_setup()

Ответы

▲ 1Принят

Вам не надо ничего очищать. Вы просто показываете тот или другой виджет
(читаем QStackedWidget).

В данном случае вам не очень и нужна функция lambda().

Привяжите слот, например _stack_2() к сигналу clicked и делайте в не все что вам надо, например меняйте фон на другой.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
'''
from PyQt6 import QtWidgets, QtCore
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget
'''
# from quiz_application import QuizApplication
# from enter_or_register import EnterOrRegister
# from login_window import LoginWindow


class EnterOrRegister(QWidget):
    def __init__(self):
        super().__init__()

        self.select_enter_register = QtWidgets.QLabel(self)
        self.select_enter_register.setObjectName("select_enter_register")
        self.select_enter_register.setText("Enter or register")
        self.select_enter_register.setWordWrap(False)
        self.select_enter_register.setAlignment(
            QtCore.Qt.AlignmentFlag.AlignCenter
            )
        self.select_enter_register.adjustSize()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.select_enter_register)


class QuizApplication(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Quiz Application")
        self.setGeometry(300, 50, 645, 500)

        self.welcome_label = QtWidgets.QLabel(self)
        self.welcome_label.setObjectName("welcome_label")
        self.welcome_label.setText("Welcome to Marathon Battle!")
        self.welcome_label.setWordWrap(False)
        self.welcome_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)

        self.start_button = QtWidgets.QPushButton(self)
        self.start_button.setObjectName("start_button")
        self.start_button.setText("Start Quiz")
        self.start_button.adjustSize()

        self.quiz_QVBlayout = QtWidgets.QVBoxLayout(self)
        self.quiz_QVBlayout.addWidget(
            self.welcome_label,
            alignment=QtCore.Qt.AlignmentFlag.AlignTop
        )
        self.quiz_QVBlayout.addWidget(
            self.start_button,
            alignment=QtCore.Qt.AlignmentFlag.AlignBottom
        )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Quiz Application")
        self.setGeometry(300, 50, 645, 500)

        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.quizApplication = QuizApplication()
        self.enterOrRegister = EnterOrRegister()

        self.stack = QtWidgets.QStackedWidget(self)
        self.ix_stack_1 = self.stack.addWidget(self.quizApplication)
        ix_stack_2 = self.stack.addWidget(self.enterOrRegister)

        self.QVBlayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.QVBlayout.addWidget(self.stack)

# +++ --------------------------------------------------> vvvvvvvvvvvvv <----
        self.quizApplication.start_button.clicked.connect(self._stack_2)
#-            lambda: self.stack.setCurrentIndex(ix_stack_2))

#+->vvv vvvvvvvvvvvvvvv <----------------------------------------------------
    def _stack_2(self):
        self.stack.setCurrentIndex(1)
# +---> vvvvvvvvvvvvvvvvvv <-------------------------------------------------
        self.setStyleSheet('''
            #centralwidget {
                border-image: url(opencv_color.jpg) 0 0 0 0 stretch stretch;
            }
        ''')
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    


StyleSheet = """
#centralwidget {
    border-image: url(background.png) 0 0 0 0 stretch stretch;
}
#welcome_label {
    font-size: 23px;
}
#start_button {
    font-size: 20px;
    color: #ADFF2F;
    background-color: #008000;
}
#select_enter_register {
    font-size: 21px;
    color: #7FFF00;
    background-color: rgba(178, 34, 34, 170);
    border: 2px solid #f9009B;
    border-radius: 22px;
    min-width:  296px;
    min-height: 196px;
    max-width:  400px;
    max-height: 300px;
}
#instructional_label {
    font-size: 20px;
    color: rgba(135, 155, 200, 226);
}
"""


def application_setup():
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    application_setup()

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

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