0

我正在学习 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 按钮或 Quit 按钮时,控制台提示了一些错误:

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()

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

4

2 回答 2

2

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

注意下划线

它不能解决 control+C 问题,但程序将退出而不会在命令行上出现错误。

于 2013-04-10T08:30:30.900 回答
0

实际上,从技术上讲,这不是错误,而是例外。虽然错误是异常,但并非所有异常都必然是错误。有几个“特殊”异常,例如SystemExit,StopIteration等,python 用于各种不同的事物。sys.exit引发SystemExit异常以退出您的程序。

来自文档

sys.exit([arg])

退出 Python。这是通过引发 SystemExit 异常来实现的,因此由 try 语句的 finally 子句指定的清理操作得到遵守,并且可以在外部级别拦截退出尝试。

可选参数 arg 可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。如果它是一个整数,则零被认为是“成功终止”,任何非零值都被 shell 等视为“异常终止”。大多数系统要求它在 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().

于 2013-01-14T23:20:51.367 回答