Отсортированная и отфильтрованная древовидная модель в Python Gtk+3..?

Я пытаюсь получить древовидную модель (на самом деле список), которую можно фильтровать, а также сортировать. У меня есть следующий фрагмент кода

self.modelfilter = self.liststore.filter_new()
self.modelfilter.set_visible_func(\
            self._visible_filter_function)
self.treeview.set_model(self.modelfilter)

где self.liststore и self.treeview — стандартные объекты Gtk.ListStore и Gtk.TreeView, которые я получаю из файла Glade, а self._visible_filter_function — функция фильтрации.

Проблема в том, что self.modelfilter не поддается сортировке. Когда я нажимаю на заголовки столбцов (столбцов в self.treeview), чтобы отсортировать их, я получаю

Gtk-CRITICAL **: gtk_tree_sortable_get_sort_column_id: assertion `GTK_IS_TREE_SORTABLE (sortable)' failed

говоря, что древовидная модель не поддается сортировке.

Эта проблема кажется преодолимой в PyGtk, как предложено здесь . Идея состоит в том, чтобы сложить ListStore, TreeModelFilter и TreeSortFilter один внутри другого и передать последний в качестве модели для древовидного представления.

Однако этот трюк, похоже, не работает в Python Gtk+3. Когда я пытаюсь

self.modelfilter = self.liststore.filter_new()
self.modelfilter.set_visible_func(\
            self._visible_filter_function)
self.sorted_and_filtered_model = \
            Gtk.TreeModelSort(self.modelfilter)
self.treeview.set_model(self.sorted_and_filtered_model)

он жалуется

Gtk.TreeModelSort(self.modelfilter)
TypeError: GObject.__init__() takes exactly 0 arguments (1 given)

Теперь я попытался получить экземпляр Gtk.TreeModelSort без аргументов. Но у этого экземпляра нет никакого метода set_model.

Я потерялся здесь.

Есть ли другой способ установить модель для Gtk.TreeModelSort? Или есть совершенно другой способ получить отфильтрованный и сортируемый объект модели дерева, который можно отобразить в дереве?


person Vijay Murthy    schedule 11.09.2012    source источник


Ответы (1)


>>> from gi.repository import Gtk
>>> mymodel = Gtk.ListStore()
>>> Gtk.TreeModelSort(model=mymodel)
<TreeModelSort object at 0x1d4d190 (GtkTreeModelSort at 0x1f0d3f0)>

На мой взгляд, PyGObject еще не готов. У него нет доступной для просмотра документации, некоторые вещи еще не изучены, в частности это:

  • Иногда виджет работает с Gtk.MyWidget(attr=foo), как этот.
  • Иногда с Gtk.MyWidget.new_with_label('Foo'), например с кнопками. Да, Gtk.MyWidget(label='Foo') не работает.

С уважением

person Havok    schedule 12.09.2012
comment
Превосходно..! Это работает. Как вы сказали, очень сложно понять, что это правильный путь, поскольку документации очень мало. Спасибо. - person Vijay Murthy; 12.09.2012