Python PyGTK 列表视图排序
我在使用PyGTK的时候遇到了一个关于列表视图的问题。情况是这样的:
假设我们有一个列表视图,里面有一个播放列表,包含两行信息:歌曲名称和艺术家:
Song 1, Artist C
Song 2, Artist A
Song 3, Artist B
(实际上,还有更多的列)
每一行都可以用来对视图进行排序。比如说,如果按艺术家排序,结果会变成这样:
Song 2, Artist A
Song 3, Artist B
Song 1, Artist C
现在我需要的是播放列表的当前顺序。假设播放器正在播放歌曲3(艺术家B),歌曲播放完了,但用户通过按艺术家排序改变了顺序。此时播放列表中的下一首歌变成了歌曲1。
但是,gtk.ListStore仍然保存着旧的顺序,这就意味着播放器在播放完歌曲3后会停止,因为在重新排序之前播放列表就到这里结束了。
我不需要在列表或树视图中歌曲的路径,因为歌曲1总是会在(0,)的位置。我需要的是视图中列表的当前顺序。
我尝试了很多方法,但没有找到解决方案。如果需要的话,我可以添加代码。
更新:
我添加了一些代码来澄清:
class Player:
def __init__(self):
"Window stuff.."
self.treeView = gtk.TreeView(self.create_model())
self.treeView.set_rules_hint(True)
select = self.treeView.get_selection()
select.connect("changed", self.on_tree_selection_changed)
self.treeView.connect("button-press-event", self.on_double_click)
"Window stuff.. Packing etc."
def create_model(self):
"""Returns a gtk.ListStore"""
store = gtk.ListStore(str, str, str, str, int)
for song in self.songs:
store.append([song.track, song.title, song.artist, song.get_length(), song.id])
return store
def create_columns(self, treeView):
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Track", rendererText, text=0)
column.set_sort_column_id(0)
treeView.append_column(column)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Title", rendererText, text=1)
column.set_sort_column_id(1)
treeView.append_column(column)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Artist", rendererText, text=2)
column.set_sort_column_id(2)
treeView.append_column(column)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Length", rendererText, text=3)
column.set_sort_column_id(3)
treeView.append_column(column)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Id", rendererText, text=4)
column.set_sort_column_id(4)
2 个回答
0
假设你歌曲的格式是按照这个顺序排列的
from operator import itemgetter
list1=[('Song 1', 'Artist C'),('Song 2', 'Artist A'),('Song 3', 'Artist B')]
#sort by artist
print sorted(list1,key=itemgetter(1))
#output [('Song 2', 'Artist A'), ('Song 3', 'Artist B'), ('Song 1', 'Artist C')]
#sort by song
print sorted(list1,key=itemgetter(0))
#[('Song 1', 'Artist C'), ('Song 2', 'Artist A'), ('Song 3', 'Artist B')]
1
我只需要使用 TreeModelSort(childmodel) 这个方法。
感谢大家的帮助!
解决方案:
self.sorted_model = gtk.TreeModelSort(self.list_store())
def get_current_order(self):
current_order = []
widget = self.sorted_model
for item in widget:
current_order.append(item[5])
return current_order