Hi,
I am seeing a significant memory leak when using the set_cell_data_func() method of a gtk.TreeViewColumn. I have included an example program that illustrates the problem, I am using python2.3 on Sun Solaris 5.9 but also see the problem when running on a Linux box.
Each time the rendering function (renderFunc) is called the memory usage increases, even when the rendering function executes no code. When I commend out the call to set_cell_data_func() the memory leak does not occur.
Any help would be greatly appreciated.
Thanks,
Liza


--------------------------------

#!/opt/python/bin/python2.3
import sys
import gtk
import gobject as g

# Class for storing dummy data
class myData:
def __init__(self):
self.string1 = "string1"
self.string2 = "string2"
self.string3 = "string3"
self.string4 = "string4"
self.int1 = 1
self.int2 = 2
self.int3 = 3
self.int4 = 4


       self.double1 = 1.00
       self.double2 = 2.00
       self.double3 = 3.00
       self.double4 = 4.00

self.bool1 = gtk.TRUE
self.iter = None
return


class windowTest:
def __init__(self):
self.window = gtk.Window()
# Column Titles
self.columns = ["string1",
"string2",
"string3",
"string4",
"int1",
"int2",
"int3",
"int4",
"double1",
"double2",
"double3",
"double4",
"bool1"]
# ListStore
self.model = gtk.ListStore(g.TYPE_STRING,
g.TYPE_STRING,
g.TYPE_STRING,
g.TYPE_STRING,
g.TYPE_INT, g.TYPE_INT, g.TYPE_INT,
g.TYPE_INT,
g.TYPE_DOUBLE,
g.TYPE_DOUBLE,
g.TYPE_DOUBLE,
g.TYPE_DOUBLE,
g.TYPE_BOOLEAN)


       # gtk.TreeView
       self.view = gtk.TreeView()
       self.window.add(self.view)
       self.window.show_all()

self.view.set_model(self.model)

       # Add Columns to TreeView
       self.makeColumns()

       # Generate some dummy data
       self.data = []
       self.makeData()

       # Force screen update
       gtk.timeout_add(500, self.writeToList)

return

def makeColumns(self):
for title in self.columns:
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn(title, renderer, text=self.columns.index(title))


# Commenting out the following line gets rid of the memory leak
column.set_cell_data_func(renderer, self.renderFunc, self.columns.index(title))


           self.view.insert_column(column, self.columns.index(title))
           del renderer
           del column
       return


def renderFunc(self, column, cell, model, iter, col_no):
## print "renderFunc"
## print "column ref count =", sys.getrefcount(column)
## print "cell ref count = ", sys.getrefcount(cell)
## print "model ref count =", sys.getrefcount(model)
## print "iter ref count = ", sys.getrefcount(iter)
## print "col_no ref count =", sys.getrefcount(col_no)
## print "-------"
return
def writeToList(self):


m = self.model
i = 0
for d in self.data:
if d.iter == None:
d.iter = m.insert(0)
i += 1
print "inserting row ", i


self.model.set_value(d.iter, self.columns.index("string1"), d.string1)
self.model.set_value(d.iter, self.columns.index("string2"), d.string2)
self.model.set_value(d.iter, self.columns.index("string3"), d.string3)
self.model.set_value(d.iter, self.columns.index("string4"), d.string4)
self.model.set_value(d.iter, self.columns.index("int1"), d.int1)
self.model.set_value(d.iter, self.columns.index("int2"), d.int2)
self.model.set_value(d.iter, self.columns.index("int3"), d.int3)
self.model.set_value(d.iter, self.columns.index("int4"), d.int4)
self.model.set_value(d.iter, self.columns.index("double1"), d.double1)
self.model.set_value(d.iter, self.columns.index("double2"), d.double2)
self.model.set_value(d.iter, self.columns.index("double3"), d.double3)
self.model.set_value(d.iter, self.columns.index("double4"), d.double4)
self.model.set_value(d.iter, self.columns.index("bool1"), d.bool1)


return gtk.TRUE

   def makeData(self):
       for d in self.data:
           del d
       self.data = []

i = 0
while i < 1000:
d = myData()
self.data.append(d)
i += 1
return
def main(argv):


   w = windowTest()
   gtk.main()

if __name__ == '__main__':
   main(sys.argv[1:])



_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to