我正在尝试在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应用程序。这是第一次运行代码时发生的,因此第二次运行内核时会强制重启。这是问题吗?如果是这样,我该如何解决这个问题?
如果需要更多信息,请询问。
答案 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)。在执行单元格时,它至少可以让您开始使用正确加载的屏幕。 (任何人都希望能够纠正这个例子。)