【问题标题】:How to render custom columns with a GenericTreeModel如何使用 GenericTreeModel 呈现自定义列
【发布时间】:2013-01-24 02:47:10
【问题描述】:

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

【问题讨论】:

  • 您的数据庞大是因为它有很多行还是因为每行都包含大量数据?
  • 很多行。和列,但我只需要显示其中的一些。

标签: python pygtk gtktreeview


【解决方案1】:

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)

我希望我能给你一个关于你可以做什么的想法和一个起点。免责声明:我没有测试代码。

【讨论】:

  • 这似乎正是我想要的(第一种情况,模型中的图标和文本分开),我今晚去看看,谢谢
  • 好的,我试过了,解决方案正是教程中的一个:在树视图“后面”有一个通用模型或其他东西没有区别。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2017-09-21
  • 2012-05-28
相关资源
最近更新 更多