我正在尝试在 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/