2011-07-28 56 views
1

我開始使用GTK +編寫一個Python應用程序小工具。最近我決定做一些內存優化,並注意到我創建的大部分PyGTK對象從來都不會被垃圾收集器釋放。即使我打開一個窗口並在之後妥善銷燬,這個數字也會持續增長。Python和GTK +:如何創建垃圾回收器友好對象?

有人能指出我如何從Python創建和處理GTK +對象的正確方向。我沒有使用Glade或類似的東西。

而且我注意到,像這樣創建窗口:

class SomeWindow: 
    def __init__(self): 
     self.window = gtk.Window(type=gtk.WINDOW_TOPLEVEL) 

相反的:

class SomeWindow(gtk.Window): 
    def __init__(self): 
     super(SomeWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL) 

給出2+對象選區候選人名單少。

你可以給我的任何建議嗎?

+0

除非它是一個嚴重的錯誤,它們*將*被收集 - 遲早。循環引用使實例回收變得不可能(或至少不切實際),導致你看到的效果,但它們在GUI工具包中幾乎是不可避免的。 – delnan

+0

@delnan謝謝你的回答,當GTK + for python是基於GI的時候,這種改變會發生嗎? – MeanEYE

+0

「GC列表」是什麼意思?你的意思是你用gc.collect()得到的數字;打印len(gc.garbage())正在增加? – maxy

回答

0

你打過.destroy()嗎?

根據gtk.Widget.destroy docu GTK維護一個頂級窗口列表,它將保持引用存在。

如果您使用任何Python析構函數,它們也可以防止循環引用被釋放。

+0

如果我在頂級小部件上調用destroy,我會釋放更多的對象,但仍然不是創建的對象的數量。例如,創建一個窗口會將50個左右的對象添加到GC列表的跟蹤對象中。摧毀那個窗口我釋放了20個東西。 – MeanEYE