2015-06-02 4 views
2

Я пытаюсь запустить несколько учебных пособий pyqt5 в ноутбуке ipython, но у меня есть проблема, когда каждый второй раз я запускаю блок кода, в котором ядро ​​подвергается принудительному перезапуску , Вот наименьший код, который вызывает проблему:закрытие pyqt-виджета в ipython-записной книжке без использования sys.exit()

import sys 
from PyQt5.QtWidgets import QApplication, QWidget 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 

    w = QWidget() 
    w.setWindowTitle('Simple') 
    w.show() 

    sys.exit(app.exec_()) 

Я бегу ноутбук Ipython3 и Python 3, а также pyqt5 и использование Ubuntu 14.04. Следует отметить, что эта проблема не возникает при запуске этого же кода через скрипт в терминале.

Некоторые другие несвязанные вопросы предположили, что моя проблема может быть вызвана тем, что sys.exit() запутался с экземпляром python (я надеюсь, что это правильный термин), а не просто закрывает мое приложение pyqt. Это происходит при первом запуске кода, поэтому во второй раз, когда он запускает ядро, принудительно перезапускается. Это проблема? и если да, то как мне обойти это?

Если требуется дополнительная информация, обратитесь к нам.

+1

Я делаю то же самое прямо сейчас (играя с Qt под ноутбуком). Я заменил вызов 'sys.exit (app.exec _()) с помощью только' app.exec _() 'и, похоже, выполняет эту работу ... пока я не называю' QtCore.QCoreApplication.instance () .quit'. Точно так же, как и вы, я хотел бы более подробное объяснение того, что происходит. – Taar

ответ

0

Я пробовал решение Taar, но все еще получил мертвое ядро ​​после вызова ячейки с более чем дважды. Проблема заключается в создании нескольких приложений, это приводит к сбою ноутбука.

Существует несколько решений, которые я нашел, но только в состоянии запустить использовать Qt приложение следующее в первой ячейке:

%gui qt 
from PyQt5.QtWidgets import QApplication, QWidget 

и во второй ячейке:

if __name__ == '__main__': 

     w = QWidget() 
     w.setWindowTitle('Simple') 
     w.show() 

Вы может вызывать вторую ячейку столько раз, сколько хотите, и она будет работать. волшебная линия %gui qt открывает QApplication для вашего ноутбука.

Если вам нужно больше контроля (например, возможность выхода из него), существуют различные решения, которые позволяют проверить, открыт ли экземпляр Qapplication. Вот пример:

import sys 
from PyQt5.QtWidgets import QApplication, QWidget 
from PyQt5 import QtCore 

второй ячейки:

if __name__ == '__main__': 

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

    w = QWidget() 
    w.setWindowTitle('Simple') 
    w.show() 

    app.exec_() 

Этот метод не требует закрытия окна до выполнения его (иначе они будут в очереди: бег 3 раза, не закрывая окно, теперь вам нужно закрыть окно 3х подряд). По крайней мере, вы начнете с правильно загруженного экрана после выполнения ячейки. (кто-то может исправить этот пример).

Некоторые ссылки для второго примера: here и here. Но я не знаю достаточно о том, как qt gui взаимодействует с ноутбуком, чтобы решить любую проблему с приведенным выше примером.

Смежные вопросы