python - 在不使用 sys.exit() 的情况下关闭 ipython 笔记本中的 pyqt 小部件

标签 python python-3.x pyqt jupyter-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 应用程序。我第一次运行代码时会发生这种情况,因此第二次运行时内核被迫重新启动。这是问题所在吗?如果是这样我该如何解决这个问题?

如果需要更多信息,请询问。

最佳答案

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

我找到了多种解决方案,但为了能够运行 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)。它至少会让您在执行单元时开始正确加载的屏幕。 (欢迎任何人纠正这个例子)。

第二个示例的一些引用:here ,和here 。但我对 qt gui 如何与笔记本交互还不够了解,无法解决上述示例的任何问题。

关于python - 在不使用 sys.exit() 的情况下关闭 ipython 笔记本中的 pyqt 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606462/

相关文章:

python - 将 QGraphicsView 变换应用于保存的图像

python - Pandas 中的递归操作

python - 如何检查在 Python 中使用 Walrus 运算符时是否按下了 Enter 键?

python-3.x - Python 无法访问我的 USB 设备 - 权限不足

python - PyQt 对 QTreeWidgetItem 的有效性检查

python - MySQL返回的数据类型和python为不同的函数输出不同的类型

python - Redis、Python 通过网络发送消息

Python:亚马逊 AWS 接口(interface)?

python - 如何在执行 celery 任务后测试是否发送了电子邮件

python - 如何在 Python 中获取多个多行输入变量?