好的,这是我的问题:
我想创建一个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_())
答案 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_()