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

Python内核在关闭PyQt4 Gui应用程序后崩溃,python,python-2.7,pyqt4,Python,Python 2.7,Pyqt4,好的,这是我的问题: 我想创建一个PyQt4 Gui,它可以从python控制台(使用IDLE、Spyder控制台和IPython控制台进行测试)执行,然后允许用户更改和查看变量。关闭应用程序后,用户应该能够在控制台中进一步处理变量。但是关闭Gui会导致内核崩溃,并且不可能向控制台进行任何新的输入 我正在使用Python 2.7和PyQt4。我正在使用以下代码启动并关闭应用程序: app=QtGui.QApplication(sys.argv) MainApp=plottest() MainAp

好的,这是我的问题:

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

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

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

我不认为你的意思是内核崩溃。相反,我认为您正在谈论退出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_389;())
,将在末尾退出python控制台,窗口消失:

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

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

sys.exit(app.exec_())

我希望这会有所帮助。

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

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

我相信
sys.exit(app.exec())
会将退出代码传递到控制台并关闭它。使用simple
app.exec()
不会关闭控制台

总结代码时应如下所示:

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

我希望有帮助。

您需要做的是:

  • 在尝试创建新的QApplication实例时,请检查是否还没有QApplication实例
  • 确保QApplication对象在关闭后被删除
  • (见附件)

    使用此代码,您可以在IPython或其他任何地方任意多次重新运行应用程序。每次关闭Qt应用程序时,python中的app对象都会被删除。

    这里的简单解决方案

    只放

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

    我仍然不知道问题和解决办法。以上这些都不适合我。目前,我正在spyder GUI中编写代码,并通过发出“python”命令在“cmd”上运行。在CMD中,它运行良好


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

    hdunn的回答对我很有用。已删除sys.exit(),以避免完全退出应用程序。按照github论坛中其他人的建议,单独执行第一步,解决了部分问题,但窗口从未出现,也没有任何错误消息。表演第二部分就像一个符咒一样解决了一切!Than,hdunn

    # 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_()
    

    内核崩溃?你是说内核恐慌发生了吗?你确定吗?如果没有剩下的代码,回答你的问题也是非常困难的。“内核似乎意外死亡。请使用‘重新启动内核’继续使用此控制台。”我认为hdunn的答案应该被接受,因为它是一个比Gabriel Asqui提供的更好的实践解决方案(即使它确实在某些情况下解决了问题!)这是一个奇怪的问题,也是不太可能的解决方案。谢谢你的链接!这对我来说不起作用——第二次运行代码时,GUI的绘制方式似乎有所不同,第三次运行时,内核仍然死机
    # 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_()