Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyGTK列表视图排序_Python_Listview_Sorting_Pygtk - Fatal编程技术网

Python PyGTK列表视图排序

Python PyGTK列表视图排序,python,listview,sorting,pygtk,Python,Listview,Sorting,Pygtk,我在使用PyGTK时遇到了ListView问题。情况如下: 假设我们有一个listview,其中包含一个播放列表,有两行:歌曲名称和艺术家: 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(艺术家

我在使用PyGTK时遇到了ListView问题。情况如下:

假设我们有一个listview,其中包含一个播放列表,有两行:歌曲名称和艺术家:

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)   

假设您的歌曲格式按此顺序排列

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')]

我只是想使用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

添加一些代码将有助于看一看这里我添加了相关的代码段。pygtk中有内置的方法可以做到这一点。@Padraiccanningham我不知道这一点。所以我应该删除答案吗?还有一种方法可以添加它们;)@用户3804367他在您的问题中提供了一个链接。检查一下谢谢,我错过了链接。我会尽快检查这两个建议。谢谢。