Exception 简单的IPython示例在sys.exit()上引发异常
我正在用IPython做一些非常简单的PySide(和PyQt)教程。一个教程只是创建了一个带有一些滑块的窗口来演示插槽和信号 当我关闭正在运行的演示应用程序窗口时,我看到以下错误:Exception 简单的IPython示例在sys.exit()上引发异常,exception,pyqt4,exit,ipython,pyside,Exception,Pyqt4,Exit,Ipython,Pyside,我正在用IPython做一些非常简单的PySide(和PyQt)教程。一个教程只是创建了一个带有一些滑块的窗口来演示插槽和信号 当我关闭正在运行的演示应用程序窗口时,我看到以下错误: An exception has occurred, use %tb to see the full traceback. SystemExit: 0 To exit: use 'exit', 'quit', or Ctrl-D. 因此,我运行%tb并得到以下结果: SystemExit
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
To exit: use 'exit', 'quit', or Ctrl-D.
因此,我运行%tb并得到以下结果:
SystemExit Traceback (most recent call last)
/Workspaces/scratch/<ipython-input-1-88966dcfb499> in <module>()
33
34 if __name__ == "__main__":
---> 35 main()
/Workspaces/scratch/<ipython-input-1-88966dcfb499> in main()
29 w.show()
30 app.exec_()
---> 31 sys.exit(0)
32
33
SystemExit: 0
RuntimeError: A QApplication instance already exists.
RuntimeError: A QApplication instance already exists.
如果有帮助,下面是我的代码:
from PySide.QtCore import *
from PySide.QtGui import *
import sys
class MyWindow(QWidget):
def __init__(self):
QWidget.__init__(self, None)
vbox = QVBoxLayout(self)
self.slider1 = QSlider(Qt.Horizontal)
self.slider1.setRange(0, 99)
self.slider1.setValue(0)
vbox.addWidget(self.slider1)
self.slider2 = QSlider(Qt.Horizontal)
self.slider2.setRange(0, 99)
self.slider2.setValue(99)
vbox.addWidget(self.slider2)
self.slider1.valueChanged.connect(self.slider2Changed)
def slider2Changed(self, position):
self.slider2.setValue(self.slider2.maximum() - position)
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec_()
sys.exit(0)
if __name__ == "__main__":
main()
我在使用python运行代码时没有错误:
python myexample.py
只有在IPython(包括笔记本电脑、qtconsole或常规IPython终端)中运行代码时,才会发生此错误
更新:我的主要问题是我无法快速轻松地再次运行该应用程序。如果我再次尝试运行代码,我会得到以下结果:
SystemExit Traceback (most recent call last)
/Workspaces/scratch/<ipython-input-1-88966dcfb499> in <module>()
33
34 if __name__ == "__main__":
---> 35 main()
/Workspaces/scratch/<ipython-input-1-88966dcfb499> in main()
29 w.show()
30 app.exec_()
---> 31 sys.exit(0)
32
33
SystemExit: 0
RuntimeError: A QApplication instance already exists.
RuntimeError: A QApplication instance already exists.
这就扼杀了IPython的快速交互特性:(
sys.exit
只会引发SystemExit
来终止interperter
ipython在交互模式下执行脚本时捕捉到
SysExit
,因此这并不是一个错误,但ipython的一个功能确实可以避免在执行脚本时关闭交互解释器,因为这不是您在交互会话中通常想要的。这个答案要感谢来自e ipython用户邮件列表
当我关闭正在运行的演示应用程序窗口时,我看到以下错误:
发生异常,请使用%tb查看完整回溯。
系统出口:0
只是不要使用sys.exit(0),因为您不是在退出python,而是在运行IPython
如果您希望从(真实)命令行运行应用程序并具有返回状态,请将其添加回
如果我再次尝试执行代码,我会得到以下结果:RuntimeError:QApplication实例已存在
这是一个不能修复的PythBug,因为他们不认为它是一个bug。
请参见)
及
app=QtGui.QApplication.instance() # checks if QApplication already exists
if not app: # create QApplication if it doesnt exist
app = QtGui.QApplication(sys.argv)
这是一个足以满足我当前需要的解决方案。您需要做的是在以后删除QApplication,如中所示:
app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
使用此代码,您可以在IPython或任何其他地方重新运行应用程序,每次关闭qt应用程序时,将在python中删除该对象。检查QApplication的实例是否已存在,因为当实例已在运行且您正在尝试创建新实例时,会发生错误
如果不是QtWidgets.QApplication.instance():
app=qtwidts.QApplication(sys.argv)
其他:
app=qtwidts.QApplication.instance()
根据
首先,检查实例是否已存在,然后分配该实例或创建一个新实例:
if not QApplication.instance():
app = QApplication(sys.argv)
else:
app = QApplication.instance()
(此片段摘自@notsobreain的答案。)
然后,在show()
方法之后:
QtWidgets.QApplication.setQuitOnLastWindowClosed(True)
app.exec_()
app.quit()
不需要sys.exit()
这解决了我的问题,这完全是一样的。好的。如何解决关闭应用程序后无法再次运行的问题?我必须重新启动iPython内核才能再次执行我的应用程序。否则,我会得到以下结果:
RuntimeError:QApplication实例已经存在。
这与Qt有关。不能同时运行两个QApplication。最安全的方法是重新启动解释器。我只在PyQt4上尝试过,如果我在创建新的QApplication之前删除所有对旧QApplication的引用,它似乎会起作用。但通常情况下,您不应该在同一进程中启动另一个QApplication。嗯,当我关闭应用程序时,我不希望解释器保持它运行或保留对它的引用。所以有些东西坏了。重新启动内核不是一个好的解决方案,因为它会降低iPython的生产率。感谢您为解决此问题而编写的代码。我已经有这个问题很长时间了。感谢您提供QApplication.instance()提示。我从来不知道它有这种方法。现在,我有望在我的应用程序中实现应用程序单实例检查。:)这与@notsobrein去年给出的答案基本相同。因为您提供了额外的详细信息和参考资料,所以这是一个有用的贡献。但在发布旧问题的新答案时,承认相同点和不同点是值得的。好了,明白了。实际上,我是从我的答案中提供的链接中得到的。不管怎样,我会承认的。