Python PyGTK ListView сортировка

У меня проблема со списками при использовании 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)   

person butterfly_princess    schedule 04.07.2014    source источник
comment
добавление кода поможет   -  person Padraic Cunningham    schedule 04.07.2014
comment
посмотрите здесь pygtk.org/pygtk2reference/class-gtktreesortable.html   -  person Padraic Cunningham    schedule 04.07.2014
comment
Я добавил связанные фрагменты кода.   -  person butterfly_princess    schedule 04.07.2014


Ответы (2)


Я просто хочу использовать 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
person butterfly_princess    schedule 07.07.2014

Предполагая, что ваш формат песен в этом порядке

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')]
person sundar nataraj    schedule 04.07.2014
comment
Для этого в pygtk есть встроенные методы. - person Padraic Cunningham; 04.07.2014
comment
@PadraicCunningham, я не знаю об этом, так что мне удалить ответ? - person sundar nataraj; 04.07.2014
comment
ну альтернативой было бы добавить их;) - person Padraic Cunningham; 04.07.2014
comment
@ user3804367 он дал ссылку на ваш вопрос. Проверь это - person sundar nataraj; 04.07.2014
comment
Спасибо, ссылку пропустил. Я проверю оба предложения как можно скорее. Большое спасибо. - person butterfly_princess; 04.07.2014
comment
Гм .. Думаю, этот ответ не совсем подходит .. Мне нужен способ получить список из представления. Итак, проблема не в том, чтобы отсортировать это или что-то в этом роде. - person butterfly_princess; 04.07.2014