如何阻止 Spyder 清除变量而不是执行我的 PyQt 脚本?

How do I stop Spyder from clearing variables instead of executing my PyQt script?

当我在 Spyder 中执行我的 PyQt 脚本时,它似乎除了清除变量之外没有做任何事情。当我再次执行它时,它按预期工作。

正如您在下面看到的,我无法进一步减少代码,但问题仍然存在。 这是预期的行为吗?我做错了什么?

import sys
from PyQt5 import QtWidgets

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
window.show()
app.exec_()

详细:

  1. 我打开 Spyder。
  2. 我执行脚本。 window 打开,我通过关闭 window (预期行为)终止。
  3. 我执行脚本。几秒后,控制台returns。除了变量消失(意外行为)之外,似乎什么都没发生。
  4. 从 2 开始重复...

问题不在于变量被清除,而是 PyQt 应用程序不能在 Spyder 中重复 运行。这是 Spyder Wiki 中解决的一个常见问题:How to run PyQt applications within Spyder.

这似乎与 Spyder 本身就是一个 Qt 应用程序这一事实有关。具体来说,Wiki 条目对此进行了解释:

The most common problem when running a PyQt application multiple times inside Spyder is that a QApplication instance remains in the namespace of the IPython console kernel after the first run. In other words, when you try to re-run your application, you already have a QApplication instance initialized.

work-around 是为了确保 QApplication 实例在脚本退出时超出范围,即在函数范围内创建它。使用上面的简单示例,归结为:

import sys
from PyQt5 import QtWidgets

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    window.show()
    app.exec_()

main()