我有一个简单的gtk.TreeView
带有gtk.ListStore
模型和set_reorderable(True)
,我希望捕获当用户通过拖放列表重新排序时发出的信号/事件,但是文档无济于事:
“应用程序可以通过连接到模型的信号来监听这些更改”
所以我试图连接模型(ListStore)信号......但是惊喜! ListStore没有信号,所以你被派遣到TreeModel信号,然后我试图连接TreeModel“行重新排序”信号,没有幸运。
我应该如何捕获用户执行的列表重新排序?
答案 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()