【问题标题】:How do I sort a GTK treeview with its child different from its parent如何对其子级与父级不同的 GTK 树视图进行排序
【发布时间】:2014-01-24 09:05:59
【问题描述】:

我有一个 GTK TreeView,它将艺术家姓名显示为其父节点,并在子节点中显示他们的关联专辑,即艺术家可以拥有许多专辑

treeview - treestore 模型中的艺术家姓名连接到 TreeView 列,以便用户可以单击列标题以升序或降序对艺术家姓名进行排序。

但是 - 我还需要子专辑名称以固定的名称顺序排列,例如升序或降序

例如 - 对于固定升序的专辑,然后当列标题为升序时:

MJ -
   - Album1MJ
   - Album2MJ
PQ -
   - Album1PQ
   - Album2PQ
ZY -
   - Album1ZY

当列标题降序时:

ZY -
   - Album1ZY
PQ -
   - Album1PQ
   - Album2PQ
MJ -
   - Album1MJ
   - Album2MJ

因此,在我的树视图上使用 GtkTreeModelSort 我在第 0 列定义了 set_sort_func,这是艺术家姓名列

set_sort_func 定义为:

def _compare(self, model, row1, row2, user_data):
    sort_column = 0

    value1 = model.get_value(row1, sort_column)
    value2 = model.get_value(row2, sort_column)
    if value1 < value2:
        return -1
    elif value1 == value2:
        return 0
    else:
        return 1

这会对艺术家姓名进行排序。

我的问题是,如何应用子排序以确保专辑名称具体按升序或降序排列?

我用的是Gtk3,上面的例子是python2.7


这是我正在使用的python代码:

from gi.repository import Gtk

def _compare(model, row1, row2, user_data):
    sort_column = 0

    value1 = model.get_value(row1, sort_column)
    value2 = model.get_value(row2, sort_column)
    if value1 < value2:
        return -1
    elif value1 == value2:
        return 0
    else:
        return 1

w = Gtk.Window()
w.resize(300, 300)

model = Gtk.TreeStore(str)
model.set_sort_column_id(0, Gtk.SortType.ASCENDING)

artist_iter=model.append(None, ['PQ'])
model.append(artist_iter, ['Album1PQ'])
model.append(artist_iter, ['Album2PQ'])
artist_iter=model.append(None, ['MJ'])
model.append(artist_iter, ['ALBUM1MJ'])
model.append(artist_iter, ['ALBUM2MJ'])
artist_iter=model.append(None, ['ZY'])
model.append(artist_iter, ['ALBUM1ZY'])

tv = Gtk.TreeView(model)
tv.set_headers_clickable(True)

c=0
i=0
renderer = Gtk.CellRendererText()
col = Gtk.TreeViewColumn(c, renderer)
col.add_attribute(renderer, 'text', i)
col.set_clickable(True)
col.set_sort_column_id(0)
col.set_sort_indicator(True)
tv.append_column(col)

tree_sort = Gtk.TreeModelSort(model=model)            
tree_sort.set_sort_func(0, _compare, None)

tree_sort.set_sort_column_id(0, Gtk.SortType.ASCENDING)
tv.set_model(tree_sort)
tv.expand_all()

w.add(tv)
w.show_all()
w.connect('destroy', lambda _: Gtk.main_quit())
Gtk.main()

【问题讨论】:

    标签: python sorting treeview gtk


    【解决方案1】:

    如果您使用以下方式创建 TreeViewColumn:

    Gtk.TreeViewColumn.set_sort_column_id(0)
    

    它应该自动排序父母和孩子。试着让我知道。如果没有,把你的python代码放在​​这里。

    好的,我明白你想要什么。试试这个:

    from gi.repository import Gtk
    
    w = Gtk.Window()
    w.resize(300, 300)
    
    model = Gtk.TreeStore(str, str)
    
    tv = Gtk.TreeView(model)
    tv.set_headers_clickable(True)
    
    renderer = Gtk.CellRendererText()
    col_artist = Gtk.TreeViewColumn(0, renderer)
    col_artist.add_attribute(renderer, 'text', 0)
    col_artist.set_clickable(True)
    col_artist.set_sort_indicator(True)
    tv.append_column(col_artist)
    
    
    renderer = Gtk.CellRendererText()
    col_album = Gtk.TreeViewColumn(1, renderer)
    col_album.add_attribute(renderer, 'text', 1)
    col_album.set_clickable(False)
    tv.append_column(col_album)
    
    artist_iter=model.append(None, ['PQ', ''])
    model.append(artist_iter, ['', 'Album1PQ'])
    model.append(artist_iter, ['', 'Album2PQ'])
    artist_iter=model.append(None, ['MJ', ''])
    model.append(artist_iter, ['', 'ALBUM1MJ'])
    model.append(artist_iter, ['', 'ALBUM2MJ'])
    artist_iter=model.append(None, ['ZY', ''])
    model.append(artist_iter, ['', 'ALBUM1ZY'])
    
    col_artist.set_sort_column_id(0)
    tv.expand_all()
    
    w.add(tv)
    w.show_all()
    w.connect('destroy', lambda _: Gtk.main_quit())
    Gtk.main()
    

    我为相册添加了一列,我将其设置为不可点击且不可排序。 我将订单设置为 col_artist。 我认为是唯一的方法,但我不确定。 让我知道。 再见

    【讨论】:

    • 嗨 - 这绝对是一种解决方案 (+1),尽管它在单独的列中看起来很奇怪。例如,您不能使用 GtkGridlines 将艺术家与专辑视觉链接。如果使用 Gtk.TreeModelSort 包装模型并在排序后的模型上使用 set_sort_column_id(1) ,则可以对第二列进行排序。如果可能的话,我希望从视觉角度使用一列。
    • 我同意你的看法。我还阅读了一些文档,但没有找到任何东西。 :-( 我们确定这可能吗?无论如何,你给了我另一个 python 练习的想法!无论如何,如果你想添加专辑年份、歌曲持续时间、ecc,那么使用不同的列可能会很有用
    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2021-07-18
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多