PyQT5 程序仅在第一次编译期间返回错误 运行
PyQT5 program returning error only during first compile run
下面的例子,当运行在一个新的ipython控制台(spyder)returns“-1”时,但只在第一次尝试。之后它似乎工作正常。
from PyQt5 import QtWidgets, QtGui, QtCore
from GUI import Ui_MainWindow # importing our generated file
import sys
import numpy as np
class mywindow(QtWidgets.QMainWindow):
def __init__(self):
super(mywindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
app = QtCore.QCoreApplication.instance()
if app is None:
app = QtWidgets.QApplication(sys.argv)
application = mywindow()
application.show()
sys.exit(app.exec())
错误如下:
>runfile('C:/Users/xxx.py', wdir='C:/Users/xx/Documents/3dPackaging')
An exception has occurred, use %tb to see the full traceback.
SystemExit: -1
C:\Users\xx\Documents\Anaconda\lib\site-packages\IPython\core\interactiveshell.py:2969: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
%tb
Traceback (most recent call last):
File "", line 1, in
runfile('C:/Users/xxx.py', wdir='C:/Users/xx')
File "C:\Users\xx\Documents\Anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
execfile(filename, namespace)
File "C:\Users\xx\Documents\Anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/xx/Documents/3dPackaging/VersandkartonsPacken.py", line 64, in
sys.exit(app.exec())
SystemExit: -1
我不知道这可能是什么,但由于有一天这应该是一个独立的程序,恐怕到时候它可能会很乱,所以我宁愿修复它。我应该尝试什么?
没有 GUI.py 就无法重现,所以这里是:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1127, 910)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_schliessen = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_schliessen.setGeometry(QtCore.QRect(930, 770, 75, 23))
self.pushButton_schliessen.setObjectName("pushButton_schliessen")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(440, 20, 421, 31))
font = QtGui.QFont()
font.setPointSize(20)
self.label.setFont(font)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 770, 75, 23))
self.pushButton.setObjectName("pushButton")
self.tableWidget_input = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_input.setGeometry(QtCore.QRect(160, 80, 421, 671))
self.tableWidget_input.setObjectName("tableWidget_input")
self.tableWidget_input.setColumnCount(0)
self.tableWidget_input.setRowCount(0)
self.tableWidget_output = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_output.setGeometry(QtCore.QRect(650, 80, 441, 671))
self.tableWidget_output.setObjectName("tableWidget_output")
self.tableWidget_output.setColumnCount(0)
self.tableWidget_output.setRowCount(0)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1127, 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)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_schliessen.setText(_translate("MainWindow", "Schliessen"))
self.label.setText(_translate("MainWindow", "Versandkartons Packen"))
self.pushButton.setText(_translate("MainWindow", "Berechnen"))
它似乎与 this 有关,app 从来都不是 none 但已经 returns 第一个 运行 中的 QCoreApplication。但是,将它移动到一个函数中是行不通的。而且我无法在控制台中重现实际使其在第二个 运行 中起作用的行为。似乎有什么东西将 QCorEApplication 变成了一个工作的应用程序。
在两个现已删除的答案(无效)中,建议使用 if __name__ == '__main__':
并将应用程序调用移至新的 class。那没有用。
这一定与本地系统的特殊性有关。我们(原始问题的评论者)在干净的环境中从头开始安装要求时无法重现错误(即使环境与受影响的系统非常匹配)。
请尝试重新安装您的环境,或运行在不同的系统上进行此操作,然后查看问题是否仍然存在。
我用的是conda,可能和这个问题有关。我刚刚用 pip install PyQt5
升级了 PyQT5,使这个问题消失了。所以这似乎是最简单的解决方案。
下面的例子,当运行在一个新的ipython控制台(spyder)returns“-1”时,但只在第一次尝试。之后它似乎工作正常。
from PyQt5 import QtWidgets, QtGui, QtCore
from GUI import Ui_MainWindow # importing our generated file
import sys
import numpy as np
class mywindow(QtWidgets.QMainWindow):
def __init__(self):
super(mywindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
app = QtCore.QCoreApplication.instance()
if app is None:
app = QtWidgets.QApplication(sys.argv)
application = mywindow()
application.show()
sys.exit(app.exec())
错误如下:
>runfile('C:/Users/xxx.py', wdir='C:/Users/xx/Documents/3dPackaging') An exception has occurred, use %tb to see the full traceback.
SystemExit: -1
C:\Users\xx\Documents\Anaconda\lib\site-packages\IPython\core\interactiveshell.py:2969: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
%tb Traceback (most recent call last):
File "", line 1, in runfile('C:/Users/xxx.py', wdir='C:/Users/xx')
File "C:\Users\xx\Documents\Anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile execfile(filename, namespace)
File "C:\Users\xx\Documents\Anaconda\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/xx/Documents/3dPackaging/VersandkartonsPacken.py", line 64, in sys.exit(app.exec())
SystemExit: -1
我不知道这可能是什么,但由于有一天这应该是一个独立的程序,恐怕到时候它可能会很乱,所以我宁愿修复它。我应该尝试什么?
没有 GUI.py 就无法重现,所以这里是:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1127, 910)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton_schliessen = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_schliessen.setGeometry(QtCore.QRect(930, 770, 75, 23))
self.pushButton_schliessen.setObjectName("pushButton_schliessen")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(440, 20, 421, 31))
font = QtGui.QFont()
font.setPointSize(20)
self.label.setFont(font)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 770, 75, 23))
self.pushButton.setObjectName("pushButton")
self.tableWidget_input = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_input.setGeometry(QtCore.QRect(160, 80, 421, 671))
self.tableWidget_input.setObjectName("tableWidget_input")
self.tableWidget_input.setColumnCount(0)
self.tableWidget_input.setRowCount(0)
self.tableWidget_output = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_output.setGeometry(QtCore.QRect(650, 80, 441, 671))
self.tableWidget_output.setObjectName("tableWidget_output")
self.tableWidget_output.setColumnCount(0)
self.tableWidget_output.setRowCount(0)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1127, 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)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_schliessen.setText(_translate("MainWindow", "Schliessen"))
self.label.setText(_translate("MainWindow", "Versandkartons Packen"))
self.pushButton.setText(_translate("MainWindow", "Berechnen"))
它似乎与 this 有关,app 从来都不是 none 但已经 returns 第一个 运行 中的 QCoreApplication。但是,将它移动到一个函数中是行不通的。而且我无法在控制台中重现实际使其在第二个 运行 中起作用的行为。似乎有什么东西将 QCorEApplication 变成了一个工作的应用程序。
在两个现已删除的答案(无效)中,建议使用 if __name__ == '__main__':
并将应用程序调用移至新的 class。那没有用。
这一定与本地系统的特殊性有关。我们(原始问题的评论者)在干净的环境中从头开始安装要求时无法重现错误(即使环境与受影响的系统非常匹配)。
请尝试重新安装您的环境,或运行在不同的系统上进行此操作,然后查看问题是否仍然存在。
我用的是conda,可能和这个问题有关。我刚刚用 pip install PyQt5
升级了 PyQT5,使这个问题消失了。所以这似乎是最简单的解决方案。