如何使用GenericTreeModel呈现自定义列

时间:2010-04-29 08:30:06

标签: python pygtk gtktreeview

我必须在树视图中显示一些数据。 “真正的”数据模型是巨大的,我不能复制TreeStore中的所有东西,所以我想我应该使用GenericTreeModel来充当虚拟树视图。顺便说一句,第一列是经典图标+文本样式,我想我应该用CellRendererPixbuf(faq sample)声明一个列,但我不确定模型方法on_get_n_columns()和{{1应该返回。它既是Pixbuf,也是同一列的字符串值。

1 个答案:

答案 0 :(得分:0)

查看at the tutorial,有一个示例将两个单元格渲染器打包到一列。不同之处在于您使用的是自定义树模型,其行为取决于您建模模型的方式。如果您有一个包含文本的列和一个包含pixbuf的列,则可以使用set_attributes

column = gtk.TreeViewColumn('Pixbuf and text')
cell1 = gtk.CellRenderText()
cell2 = gtk.CellRenderPixbuf()
column.pack_start(cell1, True)
column.pack_start(cell2, False)
column.set_attribute(cell1, 'text', 0) # the first column contains the text
column.set_attribute(cell2, 'pixbuf', 1) # the second column contains the pixbuf

除此之外,您可以使用只有一列的树模型,其中的对象包含您需要的所有内容,因此只需设置一个回调:

class MyObject:
    def __init__(self, text, pixbuf):
        self.text = text
        self.pixbuf = pixbuf

def cell1_cb(col, cell, model, iter):
    obj = model.get_value(iter)
    cell.set_property('text', obj.text)

def cell2_cb(col, cell, model, iter):
    obj = model.get_value(iter)
    cell.set_property('pixbuf', obj.pixbuf)

column = gtk.TreeViewColumn('Pixbuf and text')
cell1 = gtk.CellRenderText()
cell2 = gtk.CellRenderPixbuf()
column.pack_start(cell1, True)
column.pack_start(cell2, False)
column.set_cell_data_func(cell1, cell1_cb)
column.set_cell_data_func(cell2, cell2_cb)

我希望我能告诉你你能做什么和一个起点。免责声明:我没有测试代码。