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