#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()