Я пытаюсь получить древовидную модель (на самом деле список), которую можно фильтровать, а также сортировать. У меня есть следующий фрагмент кода
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
? Или есть совершенно другой способ получить отфильтрованный и сортируемый объект модели дерева, который можно отобразить в дереве?