捕获PyGTK TreeView重排序

1 投票
2 回答
1730 浏览
提问于 2025-04-15 22:41

我有一个简单的 gtk.TreeView,它使用了 gtk.ListStore 作为数据模型,并且我设置了 set_reorderable(True),这样用户就可以通过拖放来重新排序列表。我想捕捉到用户拖放重新排序时发出的信号或事件,但文档对我帮助不大:

"应用程序可以通过连接到模型的信号来监听这些变化"

于是我尝试连接模型(ListStore)的信号……结果让我很惊讶!ListStore没有信号,所以我只能去找TreeModel的信号。接着我尝试连接TreeModel的“rows-reordered”信号,但没有成功。

我该如何捕捉到用户进行的列表重新排序呢?

2 个回答

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

目前在PyGTK中没有办法做到这一点。“rows-reordered”是正确的信号,但在PyGTK中你无法从中获取任何信息,除了“某种方式被重新排序了”。在C语言的GTK+中,你可以使用同样的信号,并在回调函数中获取所需的信息,但在Python中做不到。

撰写回答