0

私が取り組んでいるプロジェクトのために PySide を学ぼうとしています。Zetcodeのチュートリアルに取り組んでいますが、最初から問題が発生しています。Enthought の Canopy を使用してコードを作成し、実行しています。コマンドラインからコードを実行すると、正常に動作します。 この質問は私の問題に関連している可能性がありますが、回答はありません。

チュートリアルの最も単純なコードを使用する場合

import sys
from PySide import QtGui    

wid = QtGui.QWidget()
wid.resize(250, 150)
wid.setWindowTitle('Simple')
wid.show()

すべてが正しく実行されます。次の例は、OOP の観点を除いて、ほぼ同じことを行います。

import sys
from PySide import QtGui

class Example(QtGui.QWidget):

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

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QtGui.QIcon('web.png'))        

        self.show()

def main():

    ex = Example()    

if __name__ == '__main__':
    main()

プログラムを実行すると、プログラムが点滅し (ウィンドウが一瞬表示されます)、閉じます。の終了前に例外を発生main()させると、ウィンドウが画面に表示されたままになります。

TL;DR

プログラムをクラスに入れると、なぜ機能しないのですか?

4

2 に答える 2

2

2 つの例の違いは、最初の例ではウィジェットへの参照をグローバル変数として保持するのに対し、2 番目の例ではローカル変数を作成し、スコープ外になると (関数が戻ると) ガベージ コレクションされることです。

これを修正する最も簡単な方法は、次のexように変数をグローバルにすることです。

def main():
    global ex
    ex = Example()

mainまたは、関数を削除して、次のようにすることもできます。

if __name__ == '__main__':        
     ex = Example()
于 2014-03-25T21:23:58.393 に答える