2016-10-17 6 views
1
  • Использование Spyder в Python 3.5.2 | Anaconda 4.2.0 (64-разрядный) пакет Windows. кварты: 5.6.0
  • Для первого запуска, окно графического интерфейса открывается, как и ожидалось
  • Для 2-го пробега, ничего не открывается, и прием Kernel умер, перезапуск сообщения журнала.

gui1.py:Ядро Python умирает для второго запуска PyQt5 GUI

import sys from PyQt5.QtWidgets import QApplication, QWidget 

app = QApplication(sys.argv) 

w = QWidget() 

w.resize(250,150) w.show() 

#sys.exit(app.exec_()) 
app.exec_() 

IPhython журнала:

runfile('F:/work/ws_python/TestProj1/gui1/gui1.py', wdir='F:/work/ws_python/TestProj1/gui1') 

runfile('F:/work/ws_python/TestProj1/gui1/gui1.py', wdir='F:/work/ws_python/TestProj1/gui1') 

Kernel died, restarting 

Kernel died, restarting 

Kernel died, restarting 

Почему ядро ​​умирает для 2-го пробега и как ее решить?

(делая то же самое, даже используя # sys.exit (app.exec_()) в качестве последней строки.)

+0

Qt не может, как вы создаете более одного объекта 'QApplication' в том же процессе. Вы можете использовать 'QtCore.QCoreApplication.instance()', чтобы получить экземпляр приложения, если он уже был создан. [Пример кода] (https://github.com/ipython/ipython/blob/master/examples/IPython%20Kernel/gui/gui-qt.py). –

+0

Не могли бы вы привести пример моего дела? Это не работает для меня. –

+1

Я думаю, что важным битом является получение существующего экземпляра приложения, если оно существует: 'app = QtCore.QCoreApplication.instance()'. Затем, если этого не существует, создайте новое приложение: 'if app is None: app = QtGui.QApplication()'. –

ответ

1

Этот код устранило проблему, спасибо за подсказку.

app = QtCore.QCoreApplication.instance() 
if app is None: 
    app = QtWidgets.QApplication(sys.argv) 
0

Это работает лучше, если ядро ​​умерло, перезапустив ошибку.

from PyQt5.QtWidgets import QApplication, QDialog 
from PyQt5.QtCore import QCoreApplication 

#app = QApplication(sys.argv) 
app = QCoreApplication.instance() 
if app is None: 
    app = QApplication(sys.argv) 
0

Для меня вышеуказанное решение работало, но только до тех пор, пока кнопка закрытия окна (из оформления окна) была использована для закрытия главного окна. Но проблема все еще присутствовала, когда программа была прервана из обработчика сигнала GUI, реагируя, например. к нажатой кнопке. После долгих пустячный, я узнал, что достаточно безопасный способ для прекращения в этой ситуации заключается в следующем:

def safeExit(self): 
    """exit the application gently so Spyder IDE will not hang""" 
    self.ui.deleteLater() 
    self.ui.quit() 

... self.ui.Button2.clicked.connect(self.safeExit) ...