Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception 简单的IPython示例在sys.exit()上引发异常_Exception_Pyqt4_Exit_Ipython_Pyside - Fatal编程技术网

Exception 简单的IPython示例在sys.exit()上引发异常

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

我正在用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                                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。 请参见)

QApplication只能有一个实例,退出某个应用程序是错误的 显然没有足够的理由删除 对象

您可以从上述问题中使用此代码:

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去年给出的答案基本相同。因为您提供了额外的详细信息和参考资料,所以这是一个有用的贡献。但在发布旧问题的新答案时,承认相同点和不同点是值得的。好了,明白了。实际上,我是从我的答案中提供的链接中得到的。不管怎样,我会承认的。