【问题标题】:Python Kernel crashes after closing an PyQt4 Gui Application关闭 PyQt4 Gui 应用程序后 Python 内核崩溃
【发布时间】:2014-07-25 07:53:49
【问题描述】:

好的,这是我的问题:

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

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

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

【问题讨论】:

  • 内核崩溃?你的意思是内核恐慌发生了吗?你确定吗?没有剩下的代码也很难回答你的问题。
  • 有类似的问题。 “内核好像意外死机了。使用‘重启内核’继续使用这个控制台。”
  • 我认为应该接受 hdunn 的回答,因为它是比 Gabriel Asqui 提供的更好的实践解决方案(即使在某些情况下确实解决了问题!)

标签: python python-2.7 pyqt4


【解决方案1】:

这里的简单解决方案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_())

【讨论】:

  • 多么奇怪的问题和不太可能的解决方案。感谢您的链接!
  • 这对我不起作用——第二次运行代码时,GUI 的绘制方式似乎有所不同,第三次运行时内核仍然死机
【解决方案2】:

你需要做的是:

  1. 在尝试创建新实例时检查是否还没有 QApplication 实例
  2. 确保 QApplication 对象在关闭后被删除

(见simple IPython example raises exception on sys.exit()

# 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()
sys.exit(app.exec_())

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

【讨论】:

    【解决方案3】:

    我不认为你的意思是内核崩溃。相反,我认为您正在谈论退出 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_())
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我认为您的问题是 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_() 
        

        希望对你有帮助。

        【讨论】:

          【解决方案6】:

          hdunn 的回答对我有用。已删除 sys.exit() 以避免完全退出应用程序。正如 github 论坛中的其他人所建议的那样,单独执行第一步,解决了部分问题,但窗口从未出现,也没有任何错误消息。执行第二部分像魅力一样解决了一切!谢谢,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_()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-06
            • 1970-01-01
            相关资源
            最近更新 更多