2013-09-23 47 views
1

一个专栏中,我知道我的问题已经在这里问:排序默认情况下或一个TreeView编程

How to Programmatically Sort TreeView

但鉴于该链接没有链接什么,我还没有能够有当我的窗口显示时,我的树视图被排序。

这里是我的代码:

treeview = Gtk.TreeView(model=liststore) 
    col = renderer_text('Nom', 1, store=liststore, sortable=True) 
    col.set_sort_order(Gtk.SortType.ASCENDING) #?????????????????????????? 
    treeview.append_column(col) 

def renderer_text(title, col, editable=False, store=None, sortable=None): 
    render = Gtk.CellRendererText() 
    if editable: 
     render.set_property('editable', True) 
     render.connect('edited', text_edited, store, col) 
    column = Gtk.TreeViewColumn(title, render, text=col) 
    if sortable: 
     column.set_sort_column_id(col) 
    return column 

的set_sort_order(Gtk.SortType.ASCENDING)将是美妙的,但它不会在没有我的情况下进行排序!

+0

也许你做得对,但列中的对象不知道如何确定它们的排序顺序。相应的类是否有'__cmp__'方法? –

+0

你有第二次打电话吗?看起来你在排序之前排序*,这似乎是一个可疑的事情。 – Veedrac

+0

我认为__cmp__方法没问题。通过单击列标题完成排序时使用它。如何做到这种不点击?我找不到任何资源来修复我的代码。我发现的每件事都是关于gtk2的。 –

回答

6

如果没有看到更多的代码,很难发现问题出在哪里,但我会下注完全相同的事情,就像在另一个问题中一样:您需要将树模型包装在Gtk.TreeModelSort中。

sorted_model = Gtk.TreeModelSort(model=liststore) 
sorted_model.set_sort_column_id(1, Gtk.SortType.ASCENDING) 
treeview = Gtk.TreeView(model=sorted_model) 

注意1是索引到模型中的列在这种情况下,不可见的树视图的列。

+0

非常感谢!令人难以置信的如此简单的事情可以阻止! –

+0

upvoting因为“索引到模型的列中,而不是可见的[东西]”。谢谢。 – mariotomo

0

如果你对简单的词典排序很满意,如果你特别懒,想象你正在开发你的界面,也许你可以使用我自己的代码中的下面的代码片段(对不起,我还是坚持gtk2)。

在这个答案中的代码看起来类似于ptomato's,但我们在数据结构的不同部分,它只是被命名为相同的方法。我只是使用普通的TreeView和普通的ListStore

gtk.TreeViewColumn小部件有一个set_sort_column_id便利方法,可以设置几乎所有需要的东西。

这里的_tvc后缀表示它是一个gtk.TreeViewColumn对象。至于说,所有的创建给予了空地文件:

self.view.widgets.use_tvc.set_sort_column_id(0) 
    self.view.widgets.filename_tvc.set_sort_column_id(1) 
    self.view.widgets.accno_tvc.set_sort_column_id(2) 
    self.view.widgets.binomial_tvc.set_sort_column_id(3) 
    self.view.widgets.iseditable_tvc.set_sort_column_id(5) 

在这里,你从林间空地文件,在那里我定义accno_tvc列片段,投入它CellRendererText,在ListStore指定列它包含一些列属性的数据。

<object class="GtkTreeViewColumn" id="accno_tvc"> 
    <property name="title" translatable="yes">acc.nr.</property> 
    <property name="clickable">True</property> 
    <child> 
    <object class="GtkCellRendererText" id="accno_crtext"> 
     <signal name="edited" handler="on_cellrenderertext_edited" swapped="no"/> 
    </object> 
    <attributes> 
     <attribute name="editable">5</attribute> 
     <attribute name="text">2</attribute> 
    </attributes> 
    </child> 
</object> 

正如你所看到的Python代码,它指定的accno_tvc桂列排序时要使用的数据列,重复同样的指数2的空地文件使用的渲染器的text属性。