Поймать изменение порядка PyGTK TreeView

У меня есть простая gtk.TreeView с моделью gtk.ListStore и set_reorderable(True), я хочу поймать сигнал/событие, испускаемое, когда пользователь изменяет порядок путем перетаскивания списка, но документация мало помогает:

"Приложение может прослушивать эти изменения, подключаясь к сигналам модели"

Поэтому я попытался подключить сигналы модели (ListStore)... но сюрприз! В ListStore нет сигналов, поэтому вы направляетесь на сигналы TreeModel, затем я безуспешно пытался подключиться к сигналу TreeModel «переупорядочение строк».

Как я должен поймать изменение порядка списка, выполненное пользователем?


person Htechno    schedule 14.05.2010    source источник
comment
Обратите внимание, что в документах Gtk указано, что этот сигнал не испускается, когда строки переупорядочиваются DND, поскольку это реализуется путем удаления и повторной вставки строки.   -  person alldayremix    schedule 29.09.2013


Ответы (2)


В настоящее время в PyGTK нет возможности сделать это. "rows-reordered" - правильный сигнал, но в PyGTK невозможно получить из него какую-либо информацию, кроме "каким-то образом переупорядоченного". В C GTK+ вы могли бы использовать тот же сигнал и получить необходимую информацию в обратном вызове, но не в Python.

person doublep    schedule 14.05.2010
comment
Но этот сигнал не испускается в PyGTK, по крайней мере, я мог вручную проверить модель, если он был испущен. - person Htechno; 15.05.2010
comment
@mkotechno: Что именно ты делаешь? Если вы перетаскиваете строки, строки с измененным порядком не отправляются, даже если это выглядит как изменение порядка из графического интерфейса. Вместо этого во время перетаскивания выдаются сигналы удаления строки и вставки строки. - person doublep; 15.05.2010
comment
@doublep Пожалуйста, добавьте это к ответу. И, возможно, стоит упомянуть, что row-deleted — лучший выбор, потому что в точке row-inserted есть одна фиктивная строка из операции перетаскивания в модели. - person schlamar; 29.08.2013

У меня тоже была эта проблема, и документы неясны. Но вот что я нашел

Сигнал «переупорядочение строк» ​​испускается, когда у вас есть

tvcolumn.set_sort_column_id(0)

Однако вы по-прежнему привязываете сигнал к модели дерева.

treestore = gtk.TreeStore(str, object)
treestore.connect("rows-reordered", self.rows_r)

Это приведет к тому, что видимый заголовок столбца станет кликабельным. Когда вы щелкаете по заголовку столбца, он меняет порядок элементов в дереве в порядке возрастания, а затем в порядке убывания, если вы щелкаете его снова и вперед и назад.

Вот простой код, который вы можете протестировать и понять, что я имею в виду.

import pygtk
pygtk.require('2.0')
import gtk

class BasicTreeViewExample:

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("Treeview")
        window.set_size_request(200, 200)
        window.connect("destroy", lambda w: gtk.main_quit())

        treestore = gtk.TreeStore(str)
        treestore.connect("rows-reordered", self.rows_reordered)

        for i in range(4):
            piter = treestore.append(None, ['Item %i' % i])

        treeview = gtk.TreeView(treestore)

        tvcolumn = gtk.TreeViewColumn('Click Me!')

        treeview.append_column(tvcolumn)

        cell = gtk.CellRendererText()

        tvcolumn.pack_start(cell, True)

        tvcolumn.add_attribute(cell, 'text', 0)

        # This allows the column header ("Click me!") to be clickable and sort/order items
        tvcolumn.set_sort_column_id(0)

        window.add(treeview)
        window.show_all()


    def rows_reordered(self, a, b, c, d):
        print a
        print b
        print c
        print d


def main():
    gtk.main()

if __name__ == "__main__":
    tvexample = BasicTreeViewExample()
    main()
person sqram    schedule 26.11.2010