1

我不明白gtk.Treeview()列表模型是如何工作的:

据我了解,我必须将 lismodel 包装在 a 中,gtk.TreeModelSort()但是当我这样做时,我无法再访问 listmodel 方法了。

    lm = gtk.ListStore(object)
    listmodel = gtk.TreeModelSort(lm)
    for f in files:
        listmodel.append([f])
    return listmodel

AttributeError: 'gtk.TreeModelSort' 对象没有属性 'append'

我正在使用这个示例来源):如何使表格在每一列上都可排序?

4

1 回答 1

5

gtk.TreeModelSort只是一个模型(访问接口),它实际上并不存储任何东西。事实上,您不需要自己调用它来使您的表可排序。最简单的方法是让 GTK 为您进行排序,这意味着您必须在表中存储 C 数据而不是 Python 对象。因此,将您的make_list()方法更改为

listmodel = gtk.ListStore(str)

而不是object. 然后你只需要告诉gtk.TreeView点击第一列标题应该根据第一列gtk.ListStore排序

self.tvcolumn[0].set_sort_column_id(0)

进入你的构造函数。要按文件大小排序,您需要int在列表存储中添加一个额外的列,并将其用作排序列 ID 等。

编辑:好的,让我拼出最后一件事:

listmodel = gtk.ListStore(str, int)
for f in files:
    file_size = os.stat(os.path.join(self.dirname, f)).st_size
    listmodel.append([f, file_size])

将文件大小放在存储​​的第二列。然后,要按文件大小排序,您只需添加

self.tvcolumn[1].set_sort_column_id(1)

一般来说,我会建议重组你的代码,让所有的东西都存储在ListStore一个开头。这样,您只需将每个视图列绑定到存储列,就可以更轻松地编写单元格渲染代码。

于 2013-08-17T13:27:37.147 回答