关闭PyQt4 Gui应用程序后,Python内核崩溃

时间:2014-06-04 15:14:42

标签: python python-2.7 pyqt4

好的,这是我的问题:

我想创建一个PyQt4 Gui,可以从python控制台执行(使用IDLE,Spyder Console和IPython控制台测试),然后允许用户更改和查看变量。关闭应用程序后,用户应该能够在控制台中进一步处理变量。但是通过关闭Gui内核崩溃并且无法对控制台进行任何新输入。

我正在使用Python 2.7和PyQt4。我使用以下代码开始关闭应用程序:

app=QtGui.QApplication(sys.argv)
MainApp=plottest()
MainApp.show()
sys.exit(app.exec_())

6 个答案:

答案 0 :(得分:6)

这里的简单解决方案https://www.reddit.com/r/learnpython/comments/45h05k/solved_kernel_crashing_when_closing_gui_spyder/

只提出

if __name__ == "__main__":
    app=0           #This is the solution
    app = QtGui.QApplication(sys.argv)
    MainApp = Dice_Roller()
    MainApp.show()
    sys.exit(app.exec_())

答案 1 :(得分:1)

我认为你的意思不是内核崩溃。相反,我认为你在谈论退出python控制台。这是由sys.exit(app.exec_())引起的。例如,尝试(例如在spyder中)以下两个代码:

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.setWindowTitle('simple')
widget.show()

#sys.exit(app.exec_())

在这里你应该得到一个空窗口,python控制台将保持活着状态。第二个,其中包含sys.exit(app.exec_()),将在结束时退出python控制台,窗口消失:

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.setWindowTitle('simple')
widget.show()

sys.exit(app.exec_())

我希望这会有所帮助。

答案 2 :(得分:1)

您需要做的是使QApplication稍后被删除,如下所示: 来自 - simple IPython example raises exception on sys.exit()

app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
app.exec_()

然后在重启时使用如下:

app = Qapplication.instance()
if not app:
    app = QApplication(sys.args)
app.aboutToQuit.connect(app.deleteLater)

使用此代码,您可以在IPython中或其他任何地方重新运行应用程序,并且每次关闭qt应用程序时,对象都将在python中删除。

答案 3 :(得分:1)

我仍然不知道问题和解决方案。以上都不适合我。目前我正在使用spyder GUI进行编码并运行在" cmd"通过给予' python'命令。在CMD中,它工作正常。

如果我得到它,请更新解决方案。 : - )

答案 4 :(得分:0)

我认为你的问题是python控制台关闭(它不是内核崩溃)。例如,在Spyder中,控制台窗口顶部的python图标变为灰色,除了运行另一个控制台之外你无法做任何事情。

无论如何,您应该写app.exec()而不是sys.exit(app.exec())

我相信sys.exit(app.exec())会将退出代码传递给控制台并关闭它。使用简单的app.exec()赢得关闭控制台。

总结您的代码应如下所示:

app=QtGui.QApplication(sys.argv)
MainApp=plottest()
MainApp.show()
app.exec_() 

我希望它有所帮助。

答案 5 :(得分:0)

hdunn的回答对我有用。删除了sys.exit()以避免完全退出应用程序。正如其他人在github论坛中建议的那样,仅执行第一步即可解决部分问题,但窗口未显示,也未显示任何错误消息。演奏第二部分可以解决所有问题,就像魅力一样!坦,哈顿!

# Check if there's a pre-existing QApplication instance 
# If there is, use it. If there isn't, create a new one.
app = QtGui.QApplication.instance()
if not app:
    app = QtGui.QApplication(sys.argv)

# Ensure that the app is deleted when we close it
app.aboutToQuit.connect(app.deleteLater)

# Execute the application
MainApp = plottest()
MainApp.show()
app.exec_()