Как разделить код PyQt6 на несколько файлов?

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

Я пишу приложение на PyQt6 и мне нужно разделить код на несколько файлов.
Первый файл создает главное окно, в котором есть кнопка по нажатии, которой очищаются все виджеты и должны добавляться новые, уже из другого файла.

Я пытался импортировать в главный файл, делал разные функции, делал lambda функции, наследовал классы, но ничего не помогло.

Вот код:

main.py

from PyQt6 import QtWidgets, QtGui, QtCore
from PyQt6.QtWidgets import QApplication, QWidget
import enter_or_register
import sys


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

        self.layout = QtWidgets.QGridLayout()

        self.pixmap = QtGui.QPixmap("marathon_battle-photo.jpg")
        self.background_label = QtWidgets.QLabel(self)
        self.background_label.setObjectName("background_label")
        self.background_label.setPixmap(self.pixmap)
        self.background_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.background_label.adjustSize()

        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.clicked.connect(self.on_start_clicked)
         #  и мне нужно чтобы по нажатию этой кнопки появлялись виджеты из второго файла 
        self.start_button.adjustSize()

        self.layout.addWidget(self.welcome_label)
        self.layout.addWidget(self.background_label)
        self.layout.addWidget(self.start_button)
        self.layout.setSpacing(10)

        self.setLayout(self.layout)

    def on_start_clicked(self):
        self.background_label.clear()
        self.welcome_label.clear()
        self.start_button.close()


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;
}

#instructional_label {
    font-size: 20px;
    color: rgba(135, 155, 200, 226);
}
"""


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


if __name__ == "__main__":
    application_setup()

enter_or_register.py

from PyQt6 import QtCore, QtWidgets
from PyQt6.QtWidgets import 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()

Ответы

▲ 1Принят

QStackedWidget Class

Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
''' 
from PyQt6 import QtWidgets, QtGui, QtCore
from PyQt6.QtWidgets import QApplication, QWidget
import enter_or_register
'''

# from enter_or_register  import EnterOrRegister
#  или так:
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("Войти или зарегистрироваться")
        self.select_enter_register.setWordWrap(False)
        self.select_enter_register.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.select_enter_register.adjustSize()
        
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.select_enter_register)


class QuizApplication(QWidget):       
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Приложение-викторина")
#        self.setGeometry(300, 50, 645, 500)
        
        self.layout = QtWidgets.QGridLayout(self)      # + self 

#        self.pixmap = QtGui.QPixmap("marathon_battle-photo.jpg")
        self.pixmap = QtGui.QPixmap("lena.jpg")
        
        self.background_label = QtWidgets.QLabel(self)
        self.background_label.setObjectName("background_label")
        self.background_label.setPixmap(self.pixmap)
        self.background_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.background_label.adjustSize()

        self.welcome_label = QtWidgets.QLabel(self)
        self.welcome_label.setObjectName("welcome_label")
        self.welcome_label.setText("Добро пожаловать в Приложение-викторину!")
        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("Продолжить")
#        self.start_button.clicked.connect(self.on_start_clicked)
#  и мне нужно чтобы по нажатию этой кнопки появлялись виджеты из второго файла 
        self.start_button.adjustSize()

        self.layout.addWidget(self.welcome_label)
        self.layout.addWidget(self.background_label)
        self.layout.addWidget(self.start_button)
        self.layout.setSpacing(10)
#        self.setLayout(self.layout)

'''
    def on_start_clicked(self):
        self.background_label.clear()
        self.welcome_label.clear()
        self.start_button.close()
'''

class MainWindow(QMainWindow):   
    def __init__(self):
        super().__init__()
        self.setWindowTitle("MainWindow")
        self.resize(645, 500)

        self.centralwidget = QWidget()                               # !!! +++
        self.centralwidget.setObjectName("centralwidget")            # !!! +++
        self.setCentralWidget(self.centralwidget)                    # !!! +++
        
        self.quizApplication = QuizApplication()
        self.enterOrRegister = EnterOrRegister()
        
        self.stack = QStackedWidget(self)                            # !!! +++
        ix_stack_1 = self.stack.addWidget(self.quizApplication)
        ix_stack_2 = self.stack.addWidget(self.enterOrRegister)
        
        self.layout = QtWidgets.QGridLayout(self.centralwidget) 
        self.layout.addWidget(self.stack)
        
        self.quizApplication.start_button.clicked.connect(
            lambda: self.stack.setCurrentIndex(ix_stack_2))
        

StyleSheet = """
#centralwidget {
    background-color: #008070;
    border-image: url(background.png) 0 0 0 0 stretch stretch;
}
#welcome_label {
    font-size: 23px;
    color: #FF7F50;
}
#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;
}
#start_button {
    font-size: 20px;
    color: #ADFF2F;
    background-color: #008000;
}
#instructional_label {
    font-size: 20px;
    color: rgba(135, 155, 200, 226);
}
"""


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

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

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