代码之家  ›  专栏  ›  技术社区  ›  Htechno

Catch PyGTK树视图重新排序

  •  1
  • Htechno  · 技术社区  · 16 年前

    gtk.TreeView 用一个 gtk.ListStore 模型和 set_reorderable(True) ,我想捕捉用户通过拖放重新排序时发出的信号/事件;删除列表,但文档没有多大帮助:

    所以我试着连接模型(ListStore)信号。。。但是惊喜!ListStore没有信号,所以您被分派到TreeModel signals,然后我尝试连接TreeModel“rows reordered”信号而没有幸运。

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

    2 回复  |  直到 13 年前
        1
  •  3
  •   doublep    16 年前

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

        2
  •  0
  •   sqram    15 年前

    “行重新排序”信号在

    tvcolumn.set_sort_column_id(0)
    

    但是,您仍然将信号绑定到treemodel。

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