使用 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(未指定的错误)