Как я могу заставить экран загрузки отображаться до полной загрузки окна?

#python #python-3.x #pyqt #pyqt5

#python #python-3.x #pyqt #pyqt5

Вопрос:

Итак, у меня есть окно моего приложения, которое, кажется, открывается медленно, так как в нем должно быть загружено около 400 PNGS. Я хотел бы, чтобы экран загрузки отображался до его полной загрузки. Код окна выглядит примерно так:

 from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_Form3(object):
    def setupUi(self, Form3):

    #design choices

    self.scrollArea = QtWidgets.QScrollArea(self.frame) #a scroll area that contains 400 buttons
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
    self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 639, 40712))
    self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
    self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
    self.verticalLayout.setObjectName("verticalLayout")
    for i in range(400):  #this part generates all the buttons
        iplusone = i   1
        bttnstring = "pushButton_"   str(iplusone)
        self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_2)
        self.pushButton.setText('sometext')
        self.pushButton.setObjectName(bttnstring)
        self.verticalLayout.addWidget(self.pushButton)
    
    #more design choices

    def retranslateUi(self, Form3):
    _translate = QtCore.QCoreApplication.translate
    Form3.setWindowTitle(_translate("Form3", "App"))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Form3 = QtWidgets.QWidget()
    ui = Ui_Form3()
    ui.setupUi(Form3)
    Form3.show()
    sys.exit(app.exec_())
  

Могу ли я создать экран загрузки, который откроется, когда это окно должно открыться, и оставаться активным до тех пор, пока переменная i не достигнет значения 400? Если нет, что еще я мог сделать?

Ответ №1:

Да, вы можете.

 if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    # loading widget
    app.loading = LoadingWidget()
    app.loading.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)  # make it always active
    app.loading.show()

    Form3 = QtWidgets.QWidget()
    ui = Ui_Form3()
    ui.setupUi(Form3)
    Form3.show()
    sys.exit(app.exec_())
  

Затем, где-то внутри вашей функции, которая загружает изображения, добавьте:

 loading = QtWidgets.QApplication.instance().loading
loading.hide()
  

Бонус. Какой-то загрузочный виджет:

 class LoadingWindow(QWidget):
    def __init__(self, parent):
        super().__init__(parent)

        main_layout = QtWidgets.QHBoxLayout()
        self.text = QLabel("Loading, please wait")
        self.text.setStyleSheet("QLabel { color: white; }")

        main_layout.addWidget(self.text)

        self.setStyleSheet("background-color: #59595e")
        self.setLayout(main_layout)

    def show(self):
        # you can override this method to put your widget at center etc..
        super().show()