如何对其子级与其父级不同的GTK树视图进行排序

时间:2014-01-06 20:37:19

标签: python sorting treeview gtk

我有一个GTK TreeView,它将Artist名称显示为其父节点,并在子节点中显示相关的Albums,即艺术家可以拥有多个专辑

树视图中的艺术家名称 - 树库模型连接到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()

1 个答案:

答案 0 :(得分: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。 我认为这是唯一的方法,但我不确定。 让我知道。 再见