私はQTを初めて使い、PythonでプログラミングするためにQT 5を使っています。私はメインウィンドウを持っていますが、2番目のウィンドウのボタンをクリックしようとすると、表示されますがすぐに消えます。誰も私はこの問題を解決する方法を知っていますか?QTが消える第2のウィンドウ
def SecondWindow():
qw = QWidget()
qw.resize(800, 800)
qw.move(300, 300)
qw.show()
私はQTを初めて使い、PythonでプログラミングするためにQT 5を使っています。私はメインウィンドウを持っていますが、2番目のウィンドウのボタンをクリックしようとすると、表示されますがすぐに消えます。誰も私はこの問題を解決する方法を知っていますか?QTが消える第2のウィンドウ
def SecondWindow():
qw = QWidget()
qw.resize(800, 800)
qw.move(300, 300)
qw.show()
PythonはC++とは異なります。後者では、ウィジェットをリークしても、コードは必要に応じて機能します。技術的には、QApplication::topLevelWidgets
からアクセスできるので、ウィジェットは漏れません。
SecondWindow
終了後のqw
への参照はありません。これはローカル変数です。したがって、ウィジェットはすぐに破棄されます。なぜなら、Pythonは最初にオブジェクトのライフタイム管理の参照カウントを使用します。ガベージコレクタはサイクルを形成するオブジェクトを収集するためだけであり、ここではそうではありません。
ソリューションは、あなたが作成したウィジェットへの参照を維持することです:
class MyClass(QObject):
@pyqtSlot()
def second_windowClick(self):
self.SecondWindow()
def SecondWindow(self):
qw = QWidget()
qw.resize(800, 800)
qw.move(300, 300)
qw.show()
self.qw = qw
ありがとうございます。しかし、私が受け取る:second_windowClick self.SecondWindow() はAttributeErrorで ファイル "app.py"、40行、 'ブール' オブジェクトが何の属性を持っていない 'をSecondWindow' 中止トラップ:どちらの関数は上記されている6 –
@DerrickJonesをメソッド。彼らはクラスに属しています!私はそれを明示した。 –
を表示[MCVE] .. – eyllanesc
変更 '' self.qw'にqw':ガベージコレクタ – eyllanesc
と 'デフ'SecondWindow()'と 'SecondWindow()'から 'self.SecondWindow()' – eyllanesc