Python Kernel crashes after closing an PyQt4 Gui A

2019-04-27 03:51发布

问题:

Ok here is my problem:

I want to create a PyQt4 Gui, which can be executed from a python console (tested with IDLE, Spyder Console and IPython Console) and then allows the user to change and view variables. After closing the app the user should be able to do further work with the variables in the console. But by closing the Gui the Kernel crashes and it is not possible to make any new input to the console.

I'm working with Python 2.7 and PyQt4. I am using the following code to start an close the application:

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

回答1:

The easy solution here https://www.reddit.com/r/learnpython/comments/45h05k/solved_kernel_crashing_when_closing_gui_spyder/

only put

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


回答2:

I do not think you mean a kernel crash. Rather, I think you are talking about exiting the python console. This is caused by sys.exit(app.exec_()). For example try (for example in spyder) the following two codes:

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

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

#sys.exit(app.exec_())

Here you should get an empty window and the python console will stay alive. The second one, where sys.exit(app.exec_()) is included, will exit the python console at the end and the window disappears:

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

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

sys.exit(app.exec_())

I hope this helps.



回答3:

What you need to do is to cause the QApplication to be deleted later as in: from - simple IPython example raises exception on sys.exit().

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

Then on restart use looks like:

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

Using this code you can rerun the application as many times as you want in IPython, or anywhere else and every time you close your qt application, the object will be deleted in python.



回答4:

I still don't know the issue and solution. None of the above worked for me. Currently I am coding in the spyder GUI and running on "cmd" by giving 'python' command. In CMD, it is working fine.

Update the solution if I get it. :-)



回答5:

I think that your problem is that python console closes (its not kernel crash). For example in Spyder python icon on top of console window becomes grey and you cant do anything besides running another console.

Anyway, you should write app.exec() instead of sys.exit(app.exec()).

I believe sys.exit(app.exec()) passes exit code to console and closes it. Using simple app.exec() won't close console.

Concluding your code should look like:

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

I hope it helps.