使用 PyQt5 制作应用程序后无法打开 .exe

Posted

技术标签:

【中文标题】使用 PyQt5 制作应用程序后无法打开 .exe【英文标题】:can't open .exe after made an app with PyQt5 【发布时间】:2021-06-06 11:36:30 【问题描述】:

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

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

    我使用“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_())

【问题讨论】:

在控制台/终端/cmd.exe/powershell 中手动运行 .exe 以查看错误消息。当您单击时,它可能会非常快地显示错误消息,您可能看不到它。 您启用了窗口选项,因此您可能不会收到任何错误消息。正如@furas 建议的那样,它可能会在终端中显示错误消息。但如果没有,请在没有 -w 的情况下再次制作 exe,然后从终端运行 exe 【参考方案1】:

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

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

【讨论】:

以上是关于使用 PyQt5 制作应用程序后无法打开 .exe的主要内容,如果未能解决你的问题,请参考以下文章

PyInstaller 问题制作使用转换器和 PyQt5 库的 exe 文件

解决PyQt5在安装后无法找到Designer.exe问题,两个位置可供参考

PyQt5 (python) GUI 在运行 .exe 后崩溃,未解决的错误代码 0x80004005(未指定的错误)

无法在 PyQt5 中打开多个窗口

如何在 Windows 10 上使用 Cx_Freeze 制作 exe,包括 PyQt5 和 OpenCV

pyqt5做了一个二维码生成器,已打包成exe可执行程序...