Hi everyone,
i am learning and writing a pygtk aplication. i have a problem with gtk.builder.
there is very small part of my application code in attachment, for test purpose
and debugging.
problem is:
i think, gtk.builder object doesn't destroy completely when owner instance
destroyed. This causes memory leak. in "system monitor" (ubuntu/linux) memory
usage growing every time of window creation nearly 0.1 kb. (startup memory
around 6.3 mb and it exceeds 10 mb in minutes and growing)
small explain for code:
xTimer instance starting timeout every five secs. on every timer event, new
window creating and displaying. window destroy itself in 2 seconds. but it
seems to gtk.builder instance of window remains memory and causes memory leak.
* when i disable using gtk.builder and create window with code, no memory leaks.
* when i using using gtk.builder and not calling
"self.builder.connect_signals(self)", no memory leaks.
* using ubuntu linux 10.10. python version 2.6.6 python-gtk2-dev
2.21.0-0ubuntu1
* i know that if i create window at application start and use show/hide method,
it will work. But i want to solve and understand this problem :)
Thanks a lot...
Hakan Kizilhan
here is code: (also added as attachment)
-----------main.py-----------------------------------------------------------------
import gtk, pygtk, gobject
#builder = gtk.Builder()
class Display(object):
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_objects_from_file("gui.glade", ["Display_Window"])
#get widgets
self.display_window = self.builder.get_object("Display_Window")
#self.display_window = gtk.Window()
self.display_text = self.builder.get_object("Display_Text")
self.disable_progress = self.builder.get_object("DisableProgress")
self.builder.connect_signals(self)
#set initials
self.timer = None
self.progress = 0
#timer stuff
self.timer = gobject.timeout_add(500, self.on_progress_timer)
#set icon
pixbuf = self.display_window.render_icon(gtk.STOCK_PREFERENCES,
gtk.ICON_SIZE_MENU)
self.display_window.set_icon(pixbuf)
#go on
self.display_window.show()
def on_Display_Window_delete_event(self,widget,data=None):
gobject.source_remove(self.timer)
self.display_window.destroy()
def on_progress_timer(self): #timing for window destroy
seconds = 2
self.progress = self.progress + ( (1. / seconds) / 2. )
new_val = self.progress
if new_val > 1.0:
# Do Exit #new_val = 0.0
self.on_Display_Window_delete_event(self)
return False
# Set the new value
print self.progress
return True
def on_DisableProgress_button_press_event(self, widget, event):
#if progressbar clicked, timer will stop
self.progress_paused = True
gobject.source_remove(self.timer)
class xTimer(object):
def __init__(self):
self.enabled = True
def on_time(self):
if self.enabled == False : return False
print "OnTime"
bb = Display() # create window
return True
def start(self):
self.enabled = True
seconds = 5
gobject.timeout_add_seconds(seconds, self.on_time)
def stop(self):
self.enabled = False
def main():
a = xTimer()
a.start()
gtk.main()
if __name__ == '__main__':
main()
-------------gui.glade-----------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="Display_Window">
<property name="width_request">550</property>
<property name="height_request">200</property>
<property name="window_position">center</property>
<signal name="delete_event" handler="on_Display_Window_delete_event"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<object class="GtkTextView" id="Display_Text">
<property name="height_request">150</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="wrap_mode">word</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="height_request">10</property>
<property name="visible">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox1">
<property name="height_request">20</property>
<property name="visible">True</property>
<child>
<object class="GtkProgressBar" id="DisableProgress">
<property name="width_request">500</property>
<property name="height_request">15</property>
<property name="visible">True</property>
<property name="events">GDK_BUTTON_PRESS_MASK |
GDK_STRUCTURE_MASK</property>
<signal name="button_press_event"
handler="on_DisableProgress_button_press_event"/>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
src.tar.gz
Description: application/gz
_______________________________________________ pygtk mailing list [email protected] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/
