在不使用sys.exit()

时间:2015-06-02 20:58:37

标签: python python-3.x pyqt ipython-notebook pyqt5

我正在尝试在ipython笔记本中运行一些pyqt5教程,但是有一个问题,即每次运行代码块时,内核都会经历强制重启。以下是导致问题的最小代码:

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 个答案:

答案 0 :(得分:1)

我尝试了Taar的解决方案但是在用main调用了两次以上的单元后仍然有一个死内核。问题是创建多个Qapplications,这会使笔记本崩溃。

我找到了多个解决方案,但是为了能够运行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_()

此方法需要在重新运行之前关闭窗口(否则它们将排队:在不关闭窗口的情况下运行3x,现在需要连续关闭窗口3x)。在执行单元格时,它至少可以让您开始使用正确加载的屏幕。 (任何人都希望能够纠正这个例子。)

第二个示例的一些参考:herehere。但是我不太了解qt gui如何与笔记本交互以解决上述例子中的任何问题。