2

GTK3 を使用して Python でプログラムを実行しています。ユーザーのニーズに応じて GUI インターフェイスを変更する必要があります。Gtk.Box を追加したウィンドウがあり、ラベルやテキスト エントリのようなものをボックスに配置し、インターフェイスを変更する必要があるときにボックスを削除すると、ラベルとテキスト エントリが削除されます。記憶に?私は Python に最も興味がありますが、C も学びたいと思っています。Cの答えは違いますか?

Gtk.Box を自動的に破棄しない場合は、ボックス内のすべてのウィジェットを常に追跡し、それぞれに対して widget.destroy() を呼び出す必要があることを意味します。ちょっともったいない気がします。

ありがとう、

ナルニー

>>> import gtk
>>> win = gtk.Window()
>>> vbox = gtk.VBox()
>>> win.add(vbox)
>>> label = gtk.Label("Hello, everybody!")
>>> vbox.pack_start(label, True, True, 0)
>>> win.show_all()
>>> vbox.destroy()

vbox.destroy() はラベル オブジェクトも破棄しますか?

4

1 に答える 1

6

コンテナを破棄すると、内部のウィジェットの参照数が減少します。ウィジェットの参照カウントがゼロに低下すると、ウィジェットは破棄されます。したがって、コードに追加の参照を保持していない場合、コンテナを破棄するとウィジェットが破棄されます。

Cでは、参照を保持しているかどうかに疑問の余地はありません。ウィジェットを作成し、それをまだコンテナーに追加していない場合、またはg_object_ref()ウィジェットで呼び出した場合は、参照があります。そうでない場合は、そうではありません。

Pythonでは、物事はより複雑です。ウィジェットがPythonインタープリターの名前にバインドされている場合は、おそらく追加の参照が追加されています。古い入力を追跡するIPythonのようなインタープリターでインタラクティブに処理を行っている場合は、おそらくいくつかの参照があります。しかし、Pythonではそれについて心配する必要はありません。ガベージコレクターは、コンテナーを破棄したときにオブジェクトが破棄されていなくても、オブジェクトに到達できなくなったときに参照を削除します。

于 2012-04-24T20:16:51.080 に答える