首页 > 解决方案 > 使用 PyQt5 制作应用程序后无法打开 .exe

问题描述

我的 Python 脚本有两个不同的问题:

  1. 我用 qt 设计器做了一个简单的设计,并将其转换为 .py 文件。在 spyder 中运行应用程序后,一切正常,但如果我关闭应用程序,我的控制台仍在运行,不会再次关闭。我必须重新启动控制台。我怎样才能避免这种情况?

  2. 我使用“pyinstaller”将 .py 文件转换为 .exe 文件。如果我双击该 exe,它将无法打开并且我没有错误消息。我使用了普通命令“pyinstaller – onefile -w test.py”。我使用 Python 3.9 和 Spyder 作为 IDE。

这是我的代码。代码直接从命令“pyuic5 -x test.ui -o test.py”生成。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1280, 720)
        MainWindow.setMinimumSize(QtCore.QSize(1280, 720))
        MainWindow.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        MainWindow.setFont(font)
        MainWindow.setStyleSheet("background-color: rgb(255, 255, 255);")
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setMinimumSize(QtCore.QSize(0, 0))
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.centralwidget.setFont(font)
        self.centralwidget.setStyleSheet("")
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setMinimumSize(QtCore.QSize(0, 0))
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.tabWidget.setFont(font)
        self.tabWidget.setObjectName("tabWidget")
        self.tab_ProcessParameters = QtWidgets.QWidget()
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.tab_ProcessParameters.setFont(font)
        self.tab_ProcessParameters.setObjectName("tab_ProcessParameters")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_ProcessParameters)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setSpacing(0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.frame_background = QtWidgets.QFrame(self.tab_ProcessParameters)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.frame_background.setFont(font)
        self.frame_background.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(170, 170, 255, 255), stop:1 rgba(255, 255, 255, 255));\n"
"border-radius: 20px;")
        self.frame_background.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_background.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_background.setObjectName("frame_background")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame_background)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.gridLayout_2.addWidget(self.frame_background, 0, 0, 1, 1)
        self.tabWidget.addTab(self.tab_ProcessParameters, "")
        self.tab_Visualization = QtWidgets.QWidget()
        self.tab_Visualization.setObjectName("tab_Visualization")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_Visualization)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setSpacing(0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.frame_2_background = QtWidgets.QFrame(self.tab_Visualization)
        self.frame_2_background.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(170, 170, 255, 255), stop:1 rgba(255, 255, 255, 255));\n"
"border-radius: 20px;")
        self.frame_2_background.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2_background.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2_background.setObjectName("frame_2_background")
        self.gridLayout_3.addWidget(self.frame_2_background, 0, 0, 1, 1)
        self.tabWidget.addTab(self.tab_Visualization, "")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 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)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Test"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_ProcessParameters), _translate("MainWindow", "Process Parameters"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_Visualization), _translate("MainWindow", "Visualization"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

标签: pythonpyqt5pyinstaller

解决方案


您没有任何错误的原因是您使用了-w. 这将隐藏错误消息。如果您想查看错误消息,请先输入不带 -w 的类型,然后查看错误是什么。并且不使用--onefile它通常是有问题的。你是从构建文件夹打开应用程序吗?因为如果你是应用程序将无法工作。从 dist 文件夹打开应用程序。

使用此命令 pyinstaller filname.py-(这将向您显示错误。(从终端运行它)),然后从 dist 文件夹中打开它。如果没有错误,那么您可以 pyinstaller filname.py -w尝试隐藏终端。


推荐阅读