首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正试图在屏幕后加载主屏幕。

我正试图在屏幕后加载主屏幕。
EN

Stack Overflow用户
提问于 2022-06-18 15:56:47
回答 2查看 46关注 0票数 1

我正试着在启动屏幕后加载我的主屏幕。在运行代码时,splashscreen设法加载,但是它停止了。我该怎么解决这个问题?

这是我的SplashScreen课

代码语言:javascript
复制
class SplashScreen(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(700, 350)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.counter = 0
        self.n = 100
        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.loading)
        self.timer.start(30)

    def initUI(self):
        # layout to display splash scrren frame
        layout = QVBoxLayout()
        self.setLayout(layout)
        # splash screen frame
        self.frame = QFrame()
        layout.addWidget(self.frame)
        # splash screen title
        self.title_label = QLabel(self.frame)
        self.title_label.setObjectName('title_label')
        self.title_label.resize(690, 120)
        self.title_label.move(0, 5)  # x, y
        self.title_label.setText('Splash Screen')
        self.title_label.setAlignment(Qt.AlignCenter)
        # splash screen title description
        self.description_label = QLabel(self.frame)
        self.description_label.resize(690, 40)
        self.description_label.move(0, self.title_label.height())
        self.description_label.setObjectName('desc_label')
        self.description_label.setText('<b>Splash Screen PyQt-5</b>')
        self.description_label.setAlignment(Qt.AlignCenter)
        # splash screen pogressbar
        self.progressBar = QProgressBar(self.frame)
        self.progressBar.resize(self.width() - 200 - 10, 50)
        self.progressBar.move(100, 180)  # self.description_label.y()+130
        self.progressBar.setAlignment(Qt.AlignCenter)
        self.progressBar.setFormat('%p%')
        self.progressBar.setTextVisible(True)
        self.progressBar.setRange(0, self.n)
        self.progressBar.setValue(20)
        # spash screen loading label
        self.loading_label = QLabel(self.frame)
        self.loading_label.resize(self.width() - 10, 50)
        self.loading_label.move(0, self.progressBar.y() + 70)
        self.loading_label.setObjectName('loading_label')
        self.loading_label.setAlignment(Qt.AlignCenter)
        self.loading_label.setText('Loading...')

这是一个函数,它允许弹出屏幕加载并启动WindowApp类,但它不起作用。我所说的不起作用的意思是它不加载WindowApp。它就这么关闭了。

代码语言:javascript
复制
    def loading(self):
        # set progressbar value
        self.progressBar.setValue(self.counter)
        # stop progress if counter
        # is greater than n and
        # display main window app
        if self.counter >= self.n:
            self.timer.stop()
            self.close()
            MainWindow = QtWidgets.QMainWindow()
            ui = WindowApp()
            ui.setupUi(MainWindow)
            MainWindow.show()

        self.counter += 1

这是我的主窗

代码语言:javascript
复制
class WindowApp(QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1006, 654)

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

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 981, 641))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("../pygui/Homescreen.png"))
        self.label.setScaledContents(True)
        self.label.setWordWrap(False)
        self.label.setObjectName("label")

        self.infoBtn = QtWidgets.QPushButton(self.centralwidget)
        self.infoBtn.setGeometry(QtCore.QRect(120, 550, 181, 41))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(15)
        self.infoBtn.setFont(font)
        self.infoBtn.setStyleSheet("border-radius: 10px;\n"
                                   "border-color: 2px solid gray;\n"
                                   "background-color: rgb(255, 255, 255);")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("icons/info_icon.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.infoBtn.setIcon(icon)
        self.infoBtn.setObjectName("infoBtn")

        self.startBtn = QtWidgets.QPushButton(self.centralwidget)
        self.startBtn.setGeometry(QtCore.QRect(310, 270, 431, 111))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(28)
        self.startBtn.setFont(font)
        self.startBtn.setStyleSheet("background-color: #305E6C;\n"
                                    "color: white;\n"
                                    "border-radius: 10px;\n"
                                    "border: 2px solid white")
        self.startBtn.setObjectName("startBtn")

        self.contactsBtn = QtWidgets.QPushButton(self.centralwidget)
        self.contactsBtn.setGeometry(QtCore.QRect(720, 30, 101, 101))
        self.contactsBtn.setStyleSheet("\n"
                                       "background-color: #121212;\n"
                                       "border-radius: 50%;\n"
                                       "border: 2px solid white;")
        self.contactsBtn.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("icons/typcn_contacts.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.contactsBtn.setIcon(icon1)
        self.contactsBtn.setIconSize(QtCore.QSize(40, 40))
        self.contactsBtn.setObjectName("contactsBtn")

        self.dateBtn = QtWidgets.QPushButton(self.centralwidget)
        self.dateBtn.setGeometry(QtCore.QRect(840, 30, 101, 101))
        self.dateBtn.setStyleSheet("\n"
                                   "background-color: #121212;\n"
                                   "border-radius: 50%;\n"
                                   "border: 2px solid white;")
        self.dateBtn.setText("")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("icons/Group.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.dateBtn.setIcon(icon2)
        self.dateBtn.setIconSize(QtCore.QSize(40, 40))
        self.dateBtn.setObjectName("dateBtn")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1006, 21))
        self.menubar.setObjectName("menubar")

        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.infoBtn.clicked.connect(partial(self.show_popup))
        self.dateBtn.clicked.connect(self.openDateWindow)
        self.startBtn.clicked.connect(self.openDriveWindow)
        self.contactsBtn.clicked.connect(self.openContactWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.infoBtn.setText(_translate("MainWindow", "About"))
        self.startBtn.setText(_translate("MainWindow", "Driving Mode"))

    def show_popup(self):
        msg = QMessageBox()
        msg.setWindowTitle('About Us')
        msg.setText('Testing')
        msg.setIcon(QMessageBox.Information)
        x = msg.exec_()

    def openDateWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_DateWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

    def openDriveWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_DriveWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

    def openContactWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_ContactWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

我尝试将其更改为WindowApp(),以检查MainWindow是否有任何问题,但它能够在没有闪存屏幕的情况下加载。

代码语言:javascript
复制
app = QApplication(sys.argv)
splash = SplashScreen()
splash.show()

sys.exit(app.exec_())
EN

回答 2

Stack Overflow用户

发布于 2022-07-01 17:41:23

检查我从this previous post的答案,我认为这将对你有帮助。您可以显示启动屏幕,当启动屏幕关闭时,您可以显示您的主窗口。它类似于前面问题中的登录窗口

但是,如果您想继续以自己的方式实现代码,我想我知道问题所在。

您可以调用一个创建QMainWindow的方法,并为该QMainWindow调用.show()。方法完成后,该方法中的变量将被垃圾收集,您的QMainWindow对象也会被垃圾收集。保持引用并防止这些变量被垃圾收集的方法是通过在变量前面添加self.使其成为类变量。

我可能会重组一下,然后做这样的事情:

代码语言:javascript
复制
if __name__ == "__main__":
    app            = QApplication(sys.argv)
    splash         = SplashScreen()
    splash_closed  = splash.exec_()

    if splash_closed:                             
        window = WindowApp()   
        window.show()
        sys.exit(app.exec_())

当启动屏幕现在是一个QDialog,加载完成后,使用self.accept()关闭对话框,而不是试图显示一个新窗口:

代码语言:javascript
复制
class SplashScreen(QDialog):
    def __init__(self):
        super().__init__()
        self.setFixedSize(700, 350)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.counter = 0
        self.n = 100
        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.loading)
        self.timer.start(30)

    def initUI(self):
        ...

    def loading(self):
        # set progressbar value
        self.progressBar.setValue(self.counter)
        # stop progress if counter
        # is greater than n and
        # display main window app
        if self.counter >= self.n:
            self.timer.stop()
            self.accept()

        self.counter += 1

您还应该在主窗口上使用__init__方法,并可能将所有的self.setupUI代码移到其中,或者只执行如下操作:

代码语言:javascript
复制
class WindowApp(QMainWindow):
    def __init__(self):
        QtWidgets.QDialog.__init__(self)                                                        
        self.setupUi(self)
    
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1006, 654)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
票数 0
EN

Stack Overflow用户

发布于 2022-07-01 15:13:03

希望这能有所帮助

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import QMainWindow, QDialog, QApplication
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QFrame, QLabel, QProgressBar
from PyQt5.QtWidgets import QWidget
from PyQt5 import QtCore, QtGui
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QTimer

class SplashScreen(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(700, 350)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.counter = 0
        self.n = 100
        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.loading)
        self.timer.start(30)

    def initUI(self):
        # layout to display splash scrren frame
        layout = QVBoxLayout()
        self.setLayout(layout)
        # splash screen frame
        self.frame = QFrame()
        layout.addWidget(self.frame)
        # splash screen title
        self.title_label = QLabel(self.frame)
        self.title_label.setObjectName('title_label')
        self.title_label.resize(690, 120)
        self.title_label.move(0, 5)  # x, y
        self.title_label.setText('Splash Screen')
        self.title_label.setAlignment(Qt.AlignCenter)
        # splash screen title description
        self.description_label = QLabel(self.frame)
        self.description_label.resize(690, 40)
        self.description_label.move(0, self.title_label.height())
        self.description_label.setObjectName('desc_label')
        self.description_label.setText('<b>Splash Screen PyQt-5</b>')
        self.description_label.setAlignment(Qt.AlignCenter)
        # splash screen pogressbar
        self.progressBar = QProgressBar(self.frame)
        self.progressBar.resize(self.width() - 200 - 10, 50)
        self.progressBar.move(100, 180)  # self.description_label.y()+130
        self.progressBar.setAlignment(Qt.AlignCenter)
        self.progressBar.setFormat('%p%')
        self.progressBar.setTextVisible(True)
        self.progressBar.setRange(0, self.n)
        self.progressBar.setValue(20)
        # spash screen loading label
        self.loading_label = QLabel(self.frame)
        self.loading_label.resize(self.width() - 10, 50)
        self.loading_label.move(0, self.progressBar.y() + 70)
        self.loading_label.setObjectName('loading_label')
        self.loading_label.setAlignment(Qt.AlignCenter)
        self.loading_label.setText('Loading...')
        self.show()


    def loading(self):
        # set progressbar value
        self.progressBar.setValue(self.counter)
        # stop progress if counter
        # is greater than n and
        # display main window app
        if self.counter >= self.n:
            self.timer.stop()
            '''
            self.close()
            MainWindow = QtWidgets.QMainWindow()
            ui = WindowApp()
            ui.setupUi(MainWindow)
            MainWindow.show()
            '''
            self.ui = WindowApp()
            self.ui.show()
            self.close()

        self.counter += 1

class WindowApp(QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1006, 654)

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

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 981, 641))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("../pygui/Homescreen.png"))
        self.label.setScaledContents(True)
        self.label.setWordWrap(False)
        self.label.setObjectName("label")

        self.infoBtn = QtWidgets.QPushButton(self.centralwidget)
        self.infoBtn.setGeometry(QtCore.QRect(120, 550, 181, 41))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(15)
        self.infoBtn.setFont(font)
        self.infoBtn.setStyleSheet("border-radius: 10px;\n"
                                   "border-color: 2px solid gray;\n"
                                   "background-color: rgb(255, 255, 255);")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("icons/info_icon.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.infoBtn.setIcon(icon)
        self.infoBtn.setObjectName("infoBtn")

        self.startBtn = QtWidgets.QPushButton(self.centralwidget)
        self.startBtn.setGeometry(QtCore.QRect(310, 270, 431, 111))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(28)
        self.startBtn.setFont(font)
        self.startBtn.setStyleSheet("background-color: #305E6C;\n"
                                    "color: white;\n"
                                    "border-radius: 10px;\n"
                                    "border: 2px solid white")
        self.startBtn.setObjectName("startBtn")

        self.contactsBtn = QtWidgets.QPushButton(self.centralwidget)
        self.contactsBtn.setGeometry(QtCore.QRect(720, 30, 101, 101))
        self.contactsBtn.setStyleSheet("\n"
                                       "background-color: #121212;\n"
                                       "border-radius: 50%;\n"
                                       "border: 2px solid white;")
        self.contactsBtn.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("icons/typcn_contacts.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.contactsBtn.setIcon(icon1)
        self.contactsBtn.setIconSize(QtCore.QSize(40, 40))
        self.contactsBtn.setObjectName("contactsBtn")

        self.dateBtn = QtWidgets.QPushButton(self.centralwidget)
        self.dateBtn.setGeometry(QtCore.QRect(840, 30, 101, 101))
        self.dateBtn.setStyleSheet("\n"
                                   "background-color: #121212;\n"
                                   "border-radius: 50%;\n"
                                   "border: 2px solid white;")
        self.dateBtn.setText("")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("icons/Group.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.dateBtn.setIcon(icon2)
        self.dateBtn.setIconSize(QtCore.QSize(40, 40))
        self.dateBtn.setObjectName("dateBtn")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1006, 21))
        self.menubar.setObjectName("menubar")

        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.infoBtn.clicked.connect(partial(self.show_popup))
        self.dateBtn.clicked.connect(self.openDateWindow)
        self.startBtn.clicked.connect(self.openDriveWindow)
        self.contactsBtn.clicked.connect(self.openContactWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.infoBtn.setText(_translate("MainWindow", "About"))
        self.startBtn.setText(_translate("MainWindow", "Driving Mode"))

    def show_popup(self):
        msg = QMessageBox()
        msg.setWindowTitle('About Us')
        msg.setText('Testing')
        msg.setIcon(QMessageBox.Information)
        x = msg.exec_()

    def openDateWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_DateWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

    def openDriveWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_DriveWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

    def openContactWindow(self, MainWindow):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_ContactWindow()
        self.ui.setupUi(self.window, MainWindow)
        self.window.show()
        MainWindow.hide()

app = QApplication(sys.argv)
splash = SplashScreen()
#splash.show()

sys.exit(app.exec_())
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72670686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档