python - 当使用 spyder 3.3.3 和 ipython 7.4 时,来自 PyQt5 的 app.exec 阻止了代码
问题描述
我已经安装了最新的 anaconda 版本(1.9.7),其中包括 python 3.7.3、spyder 3.3.3、ipython 7.4.0、pyqt 5.9.2,现在我在运行与之前版本兼容的代码时遇到问题anaconda 安装(anaconda 1.7.0,python:3.6.4,Ipython:6.2.1 和 spyder:3.2.6)。我检查了 spyder --> Tool--> preference --> Ipython console 是否与两个安装相同。
这里的代码:
import sys
from PyQt5 import QtWidgets
if __name__ == '__main__':
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
T = QtWidgets.QErrorMessage()
T.setWindowTitle('Error!')
T.showMessage('some message')
T.show()
app.exec()
所以基本上当我运行代码(上图)时,我可以看到我的 GUI 打开了。但是,当我关闭 GUI(使用 GUI 右侧的 X)时,IPython 控制台挂起,我别无选择重新启动 spyder(在这种情况下 ctr C 不执行任何操作)。我发现我可以通过删除行来解决这个问题:'app.exec()'。但是,大多数时候我是从 anaconda 提示符运行我的代码,所以我不想从我的代码中删除 'app.exec()'。这段代码在之前使用 anaconda 提示符和 spyder 的安装中运行良好(因此基本上使用和不使用 ipython)。
我已经尝试过工具--> Ipython 控制台--> 图形--> 后端--> 自动,它没有改变任何东西。如果我取消选中“激活支持”(工具--> Ipython 控制台--> 图形),它可以解决问题,但我不想朝那个方向前进,因为我发现我无法正确使用 matplotlib(如果没有 plt.show(),绘图将不会显示,这将阻止 ipython)(之前的安装“激活支持”已选中)。我当然可以回到以前的安装,但我想避免这种情况,因为旧安装有其他问题(我相信最新版本应该可以正常工作)。我知道我可以临时解决这个问题(当我使用 spyder 或取消选中“激活支持”时删除 app.exec())但我想知道我是否' 我遗漏了一些东西,或者这是与新 ipython 相关的问题。如果您有任何建议,请告诉我。
解决方案
(这里是 Spyder 维护者)你说
我发现我可以通过删除行来解决这个问题:'app.exec()'。
因此,如果您想在 Spyder 内外运行代码,可以将该行包含在以下if
块中:
import os
if not os.environ.get('SPY_UMR_ENABLED'):
app.exec()
这将避免在 Spyder 中运行它,因为SPY_UMR_ENABLED
环境变量存在于我们的控制台中,但它不存在于 Anaconda 提示符或 Jupyter 笔记本中。
推荐阅读
- flutter - 在 tabBarView 页面中使用导航器后,数据丢失
- google-cloud-platform - 使用 Google 数据流管道读取/解析/写入文件的推荐方法是什么?
- reactjs - 反应超过最大更新深度
- python - 如何简化代码以在数组列表的开头和结尾添加数字?
- c# - 为什么要更快地声明和分配本地迭代器而不是使用全局迭代器?
- jquery - 如何在 Angular 7 上添加第三方插件 jquery?
- c# - 即使 ThreadPool.GetAvailableThreads() 表示丰富,任务也会受到调度缓慢的影响吗?
- c# - 文本框添加多行文本而不替换第一行文本
- entity-framework-6 - 加载实体时违反多重性约束错误
- c# - burp 站点显示 WebAPI 的 ajax 调用 url 及其参数