【发布时间】: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