2014-01-06 23 views
0

我有一個GTK樹視圖顯示在IE的藝術家子節點藝術家名稱作爲它的父節點及其關聯相冊可以有很多的專輯如何排序GTK樹形與其子從父不同

的樹視圖中的藝術家名稱 - treestore模型連接到TreeView列,以便用戶可以單擊列標題按照升序或降序排列藝術家名稱。

但是,我還需要孩子專輯名稱的固定名稱順序,例如升序或降序

例如 - 在固定升序然後相冊當列標題升序:

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

當列標題降序:

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

因此,使用GtkTreeModelSort在我的樹視圖上,我已經定義了0列上的set_sort_func,它是Artist Name列

set_sort_func是defi ned as:

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

,如果你與你的創造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。 我認爲是唯一的方式,但我不確定。 讓我知道。 再見

+0

修改我的答案。 – maurelio79

+0

嗨 - 這絕對是一個解決方案(+1),雖然它與單獨的列看起來很奇怪。例如,您不能使用GtkGridlines將藝術家與相冊進行可視化鏈接。如果使用Gtk.TreeModelSort包裝模型,並在排序的模型上使用set_sort_column_id(1),則可以對第二列進行排序。如果可能的話,我寧願使用從視覺角度來看的一列。 – fossfreedom

+0

我同意你的意見。我還閱讀了一些文檔,但沒有發現nothig。 :-(我們確信它是可能的嗎?無論如何,你給了我另一個python練習的想法!無論如何,如果你想添加專輯年份,歌曲持續時間,ecc – maurelio79