我最近开始在 PySide 中进行 GUI 编程,但我遇到了有关退出命令的奇怪问题。
Sys.exit([x])
似乎被广泛用于停止 PySide 程序;但是,每当我在使用类的 PySide 程序中使用它时,它不会向 PyCharm 返回退出代码或停止任务管理器中的 Python 进程。
奇怪的是,使用 PySide 时似乎很难做到这两件事;我可以跳出主循环,调用
sys.exit(0)
,raise SystemExit(0)
,它不会停止在后台运行。这仅发生在使用PySide时,并且仅发生在使用类构造小部件时。
我尝试了各种组合,但我可以可靠地终止进程的唯一方法是使用
os._exit(0)
,这有点残酷。奇怪的是,我似乎是遇到这个问题的极少数人之一,我很好奇导致它的原因。
我通过使用
Zetcode中的
sys.exit(app.exec_())
运行 Pyside 教程脚本来验证这不是我的代码本身的错误。同样,调用 sys.exit()
不会返回退出值或终止 Python 进程。由于这是一个教程,我假设对于大多数人来说,这段代码可以正常工作。这可能是版本问题吗(我使用Python 3.4和PySide 1.2.2)?
编辑;我还发现将 sys.exit(0) 命令放在哪里并不重要,只要它位于我的类定义之后即可。 Imports > sys.exit() > class 会立即退出(正如人们所期望的那样),但是 Imports > class > sys.exit() - 即使我实际上还没有调用任何类 - 也不会正确关闭程序。
我没有看到这种行为。这意味着我可以使用
sys.exit
来停止 PySide 程序。不过,我更经常使用 app.quit
,其中 app
是 QApplication
实例。
示例:
import sys
from PySide import QtGui
class MyWindow(QtGui.QWidget):
def __init__(self):
super().__init__()
layout = QtGui.QVBoxLayout(self)
button1 = QtGui.QPushButton('app.quit')
button1.clicked.connect(app.quit)
layout.addWidget(button1)
button2 = QtGui.QPushButton('sys.exit')
button2.clicked.connect(sys.exit)
layout.addWidget(button2)
app = QtGui.QApplication([])
window = MyWindow()
window.show()
app.exec_()
这里两种方法都可以。
我在 Windows 7 上使用 Python 3.3 的 PySide 1.2.2。
对于其他进入这个兔子洞的人来说,从环境中完全删除 Anaconda(在我的例子中是 miniconda3)解决了我的退出挂起问题。
我假设我在使用 conda 时搞砸了。