7

我正在尝试获得一个可以过滤和排序的树模型(实际上是一个列表存储)。我有以下一段代码

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

whereself.liststore和是我从 glade 文件中获得self.treeview的标准Gtk.ListStore和对象,并且是过滤功能。Gtk.TreeViewself._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?或者是否有一种完全不同的方法来获取可以在树视图中显示的过滤和可排序树模型对象?

4

1 回答 1

9
>>> 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') 不起作用。

亲切的问候

于 2012-09-12T01:13:44.377 回答