Python Kernel crashes after closing an PyQt4 Gui A

2019-04-27 03:28发布

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

5条回答
疯言疯语
2楼-- · 2019-04-27 03:51

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楼-- · 2019-04-27 03:51

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.

查看更多
Deceive 欺骗
4楼-- · 2019-04-27 03:53

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.

查看更多
男人必须洒脱
5楼-- · 2019-04-27 04:05

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_())
查看更多
一纸荒年 Trace。
6楼-- · 2019-04-27 04:08

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. :-)

查看更多
登录 后发表回答