1

我的项目中有一个奇怪的错误,它使用 PySide 作为其 Qt GUI,作为回应,我试图用设置环境的更简单的代码进行测试。

这是我正在测试的代码:https ://stackoverflow.com/a/6906552/130164

当我从我的 shell ( python test.py) 启动它时,它运行良好。但是,当我在 Spyder 中运行该脚本时,出现以下错误:

Traceback (most recent call last):
  File "/home/test/Desktop/test/test.py", line 31, in <module>
    app = QtGui.QApplication(sys.argv)
RuntimeError: A QApplication instance already exists.

如果有帮助,我还会收到以下警告:

/usr/lib/pymodules/python2.6/matplotlib/__init__.py:835: UserWarning:  This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

为什么该代码从我的 shell 启动而不是从 Spyder 启动时有效?


更新: Mata 回答说问题的发生是因为 Spyder 使用 Qt,这是有道理的。目前,我已经使用“在外部系统终端中执行”选项在 Spyder 中设置了执行,这不会导致错误,但也不允许调试。Spyder 是否有任何内置的解决方法?

4

4 回答 4

2

作为Spyder一个Qt应用程序,它启动它自己的QApplication. 在同一个过程中只能QApplication存在一个,这就是你得到第一个错误的原因。

Sypder也使用matplotlib,并且可能,因此它已经导入了一些提到的模块,所以这就是你得到第二个错误的原因。

因此,当这样使用它时,您无法创建自己的QApplication或调用matplotlib.use(). 或者,如果您将这些调用包装在try/中,它可能会起作用except

于 2012-05-22T22:52:59.043 回答
2

我有同样的问题,stackoverflow 上的某个地方是一个解决方案。

代替

qApp = QtGui.QApplication(sys.argv)

利用

qApp = QtGui.QApplication.instance()
if qApp is None:
        qApp = QtGui.QApplication(sys.argv)
于 2013-06-28T12:43:40.117 回答
1

如果您尝试将应用程序启动到交互式控制台中,它将无法在 Spyder 中运行,因为该控制台专门配置为导入多个科学库、自动show()matplotlib 图形和其他一些细节。scientific在 Spyder 控制台提示符下键入以获取更多详细信息。结果是 Qt 应用程序事件循环已经在那里运行。

要让您的应用程序在 Spyder 内部运行:

  1. 确保将 Spyder 配置为使用 PySide 而不是 PyQt 打开外部控制台。这可以从 Tools>Preferences>Console>External modules>Qt-Python bindings library selection 进行设置。
  2. 在编辑器中激活您的脚本后,点击F6打开“运行设置”对话框。选择“在新的专用 Python 解释器中执行”单选按钮,而不是在当前交互式解释器中执行。单击OK。现在通过点击运行脚本F5。通过点击调试脚本Ctrl+F5
于 2013-06-29T04:17:31.470 回答
0

官方 Spyder wiki 有一个关于该主题的页面:https ://github.com/spyder-ide/spyder/wiki/How-to-run-PyQt-applications-within-Spyder 。它的要点是:

重要提示:在 Spyder 中运行 PyQt 应用程序之前,您需要将图形后端更改为Automatic. 你可以通过去

Tools > Preferences > IPython Console > Graphics

之后,请重新启动您的控制台内核或 Spyder 本身以使此更改生效。

末有解释:

在 Spyder 中多次运行 PyQt 应用程序时最常见的问题是 QApplication 实例在第一次运行后仍保留在 IPython 控制台内核的命名空间中。换句话说,当您尝试重新运行您的应用程序时,您已经初始化了一个 QApplication 实例。

尝试删除该实例可能会导致您的程序卡在阻塞的 while 循环中,如此处所建议,并且 usingsys.exit()无济于事,因为它与尝试退出 Python(以及因此退出 IPython 控制台)相同。

建议的解决方案是做类似@mata suggsets的事情。

于 2020-04-15T14:19:40.220 回答