在pyqt4中退出应用程序的正确方法是什么?

时间:2012-07-03 02:08:09

标签: python-3.x pyqt4

我正在学习pyqt4并正在关注互联网上的教程。不知何故,示例代码中的退出行不起作用:

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode PyQt4 tutorial 

This program creates a quit
button. When we press the button,
the application terminates. 

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):               

        qbtn = QtGui.QPushButton('Quit', self)
        qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)       

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

当我按下gui中的X按钮或退出按钮时,控制台出现了一些错误:

Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "D:\Raymond\Programming Practice\python\gui_qt\lesson1_basic\gui_quit.py", line 46, in <module>
    main()
  File "D:\Raymond\Programming Practice\python\gui_qt\lesson1_basic\gui_quit.py", line 42, in main
    sys.exit(app.exec())
SystemExit: 0

我通过替换行

修复了代码
sys.exit(app.exec())

这一行:

return app.exec()

然后应用程序正常退出。但是我不确定这种方法是否有任何缺点,因为它只返回状态。

2 个答案:

答案 0 :(得分:2)

我认为你会发现正确的语法是sys.exit(app.exec_())

注意下划线

它无法解决控制+ C问题,但程序将退出而不会在命令行中显示错误。

答案 1 :(得分:0)

实际上,这在技术上并不是一个错误,它是一个例外。虽然错误是例外,但并非所有异常都必然是错误。有几个“特殊”异常,例如SystemExitStopIteration等等,python用于各种不同的事情。 sys.exit会引发SystemExit例外以退出您的计划。

来自Docs

  

sys.exit([参数])

     

退出Python。这是通过引发SystemExit异常来实现的,因此可以接受try语句的finally子句指定的清理操作,并且可以拦截外层的退出尝试。

     

可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值被贝壳等视为“异常终止”。大多数系统要求它在0-127范围内,否则会产生不确定的结果。有些系统有一个约定,用于为特定的退出代码分配特定的含义,但这些通常是不发达的; Unix程序通常使用2表示命令行语法错误,1表示所有其他类型的错误。如果传递了另一种类型的对象,则None等效于传递零,并且任何其他对象将打印到stderr并导致退出代码为1.特别是,sys.exit(“some error message”)是一种快速方法发生错误时退出程序。

     

由于exit()最终“只”引发异常,它只会在从主线程调用时退出进程,并且不会拦截异常。

所以,sys.exit(app.exec())raise SystemExit(app.exec())没什么不同。在这种情况下,通过添加sys.exit,您真正改变的唯一方法是返回app.exec()给出的退出代码。