Компаратор сортировки по нескольким значениям для сортировки Gtk treeView

Я следовал руководству по python Gtk2. Существует возможность сортировать элементы treeView или listView по пользовательской функции-разделителю:

def compare(model, row1, row2, user_data):
    sort_column = 0
    value1 = model.get_value(row1, sort_column)
    value2 = model.get_value(row2, sort_column)
    # here beginns the interresting part
    if value1 < value2:
        return -1
    elif value1 == value2:
        return 0
    else:
        return 1

В моей модели treeStore я сохранил имена файлов и логические значения is_directory. Сортировка должна быть: сначала каталоги по алфавиту, а потом файлы по алфавиту.

Мне нужно адаптировать компаратор, потому что он может работать с двумя значениями: именами файлов и логическими значениями, если это каталоги или нет.

Я старался:

def compareFileListEntries(self, fileListModel, row1, row2, user_data):

        name1 = fileListModel.get_value(row1, 1)
        name2 = fileListModel.get_value(row2, 1)
        isDir1 = fileListModel.get_value(row1, 2)
        isDir2 = fileListModel.get_value(row2, 2)

        if isDir1 < isDir2:
            return -1
        elif isDir1 > isDir2:
            return 1
        else:
            if name1 < name2:
                return -1
            elif name1 == name2:
                return 0
            else:
                return 1

Это сначала сортирует каталоги - в случайном порядке, а затем файлы также в случайном порядке. Может ли кто-нибудь указать мне на мою ошибку?


person karlitos    schedule 03.05.2014    source источник


Ответы (1)


Вопрос был в другой части. Приведенный выше код в основном в порядке. Я сделал некоторые адаптации, поэтому сортировка работает следующим образом: сначала каталоги, по алфавиту, без учета регистра. Имена хранятся в первом столбце моей модели treeStore, значения isDirectory — во втором. Вот код, которым я закончил:

def compareFileListEntries(self, fileListModel, row1, row2, user_data):

        name1 = fileListModel.get_value(row1, 0).lower()
        name2 = fileListModel.get_value(row2, 0).lower()
        isDir1 = fileListModel.get_value(row1, 1)
        isDir2 = fileListModel.get_value(row2, 1)

        if isDir1 > isDir2:
            return -1
        elif isDir1 < isDir2:
            return 1
        else:
            if name1 < name2:
                return -1
            elif name1 == name2:
                return 0
            else:
                return 1
person karlitos    schedule 03.05.2014