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] ボタンまたは [終了] ボタンを押すと、コンソールに次のエラーが表示されました。

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

0

実際、これは技術的にエラーではなく、例外です。エラーは例外ですが、すべての例外が必ずしもエラーであるとは限りません。SystemExit、などの「特別な」例外がいくつかあり、StopIterationpython はさまざまなことに使用します。プログラムを終了するために例外を発生させますsys.exitSystemExit

ドキュメントから:

sys.exit([引数])

Python を終了します。これは SystemExit 例外を発生させることによって実装されるため、try ステートメントの finally 句で指定されたクリーンアップ アクションが受け入れられ、外部レベルでの終了試行をインターセプトすることが可能です。

オプションの引数 arg は、終了ステータス (デフォルトはゼロ) を示す整数、または別のタイプのオブジェクトにすることができます。整数の場合、ゼロは「正常終了」と見なされ、ゼロ以外の値はシェルなどによる「異常終了」と見なされます。ほとんどのシステムでは、0 ~ 127 の範囲である必要があり、それ以外の場合は未定義の結果が生成されます。一部のシステムには、特定の意味を特定の終了コードに割り当てるための規則がありますが、これらは一般的に未開発です。Unix プログラムは通常、コマンド ライン構文エラーに対して 2 を使用し、他のすべての種類のエラーに対して 1 を使用します。別のタイプのオブジェクトが渡された場合、None は 0 を渡すことと同等であり、その他のオブジェクトはすべて 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 に答える