抓住PyGTK TreeView重新排序

时间:2010-05-14 04:10:23

标签: python gtk pygtk gtktreeview

我有一个简单的gtk.TreeView带有gtk.ListStore模型和set_reorderable(True),我希望捕获当用户通过拖放列表重新排序时发出的信号/事件,但是文档无济于事:

“应用程序可以通过连接到模型的信号来监听这些更改”

所以我试图连接模型(ListStore)信号......但是惊喜! ListStore没有信号,所以你被派遣到TreeModel信号,然后我试图连接TreeModel“行重新排序”信号,没有幸运。

我应该如何捕获用户执行的列表重新排序?

2 个答案:

答案 0 :(得分:3)

目前在PyGTK中无法做到这一点。 “行重新排序”是正确的信号,但除了“以某种方式重新排序”之外,不可能从PyGTK中获取任何信息。在C GTK +中,您可以使用相同的信号并在回调中获取所需信息,但不能在Python中使用。

答案 1 :(得分:0)

我也有这个问题而且文档不清楚。但这是我发现的

当你有

时会发出

'rows-reordered'信号

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()