2012-04-23 46 views
2

我正在使用GTK3在python中執行程序。我需要根據用戶需要更改GUI界面。如果我有一個窗口,我添加了一個Gtk.Box,然後在文本框中添加一個標籤和一個文本條目,然後當需要更改界面時,刪除Box,是否刪除標籤和文本條目在記憶中?我在Python中最有趣,但也想學習C語言。 C的答案不同嗎?是否刪除容器在GTK內存中的小部件中銷燬

如果它不會自動銷燬Gtk.Box,那麼這意味着要保持盒子中每個小部件的持續跟蹤,並且需要爲每個小部件調用一個widget.destroy()。似乎有點浪費。

感謝,

Narnie

>>> 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()也會破壞標籤對象?

+0

我的意思是vbox.destroy()銷燬標籤對象不是vbox對象(更正上面)。 – narnie 2012-04-26 00:04:00

回答

5

當你銷燬一個容器時,裏面的小部件會減少它們的引用計數。如果一個小部件的引用計數下降到零,它將被銷燬。所以如果你沒有在你的代碼中添加任何額外的引用,當你銷燬容器時,這些小部件將被銷燬。

在C中,你是否持有一個參考是絕對沒有問題的;如果您創建了該小部件,但尚未將其添加到容器中,或者在該小部件上調用了g_object_ref(),那麼您可以參考。如果沒有,不是。

在Python中,事情更復雜。如果小部件綁定到Python解釋器中的名稱,則可能會添加一個額外的引用。如果您正在像IPython這樣的解釋器中交互式地處理舊的輸入,那麼可能有幾個參考。但是你不需要擔心Python的問題。垃圾收集器將在對象無法訪問時刪除引用,即使它在銷燬容器時未被銷燬。

+0

謝謝,我問的原因是這樣的。我正在開發GUI,其中界面根據用戶的需求而改變。我打算創建和銷燬容器,併爲接口更改添加一個新的容器。我有一個想法,如果用戶來回更換很多,這可能會添加很多仍在內存中的未使用的對象,如果刪除它們的父容器不會破壞它們。我想我已經決定只玩widget.show()/ widget.hide()遊戲而不是銷燬和重新創建,但我仍然想知道它。 – narnie 2012-04-25 01:24:40

+0

@narnie我正在嘗試開發一個應用程序,它具有界面變化以及你如何做到這一點? – shreddish 2015-12-03 21:22:26

相關問題