【问题标题】:Python : sort a GTK treeviewPython:对 GTK 树视图进行排序
【发布时间】:2013-08-18 03:54:41
【问题描述】:

我不明白gtk.Treeview() 列表模型的工作原理:

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

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

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

我正在与this example (source) 合作:如何使表格在每一列上都可排序?

【问题讨论】:

    标签: python gtk pygtk


    【解决方案1】:

    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 中。这样,您只需将每个视图列绑定到存储列,就可以更轻松地编写单元格渲染代码。

    【讨论】:

    • 非常感谢,效果很好;但仅适用于第一列。其他人提出GtkWarning: gtk_list_store_set_sort_column_id: assertion 'header != NULL' failed 我想我不是quite there yet :)
    • 你们能发一个完整版吗?很难对其进行调整以使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2019-04-09
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多