0

我有一个简单的 Gtk.TreeView 和一个 Gtk.ListStore 作为模型的四列。我希望能够在 TreeView 中拖放行并跟踪发生的行插入、更改和删除,以便我可以实现撤消/重做以进行拖放操作。我正在使用 PyGObject 3 和 Python 3.2。

我认为使用 Gtk.TreeDragSource 和 Gtk.TreeDragDest 接口下的方法将完全适合我的需要,在我的 drag_data_get 处理程序中使用 Gtk.TreeDragSource.drag_data_get() 和在我的 drag_data_received 中使用 Gtk.TreeDragDest.drag_data_received() 或 Gtk.tree_get_row_drag_data()处理程序。基本上,我尝试过的看起来像这样:

def drag_data_get(self, tv, context, selection, target_id, time):
    treeselection = tv.get_selection()
    model, my_iter = treeselection.get_selected()
    path = model.get_path(my_iter)
    result = Gtk.TreeDragSource.drag_data_get(path, selection)

def drag_data_received(self, tv, context, x, y, selection,  info, time):
    result, model, row = Gtk.tree_get_row_drag_data(selection)
    my_iter = model.get_iter(row)
    data = [model.get_value(my_iter, i) for i in range(model.get_n_columns())]
    drop_info = tv.get_dest_row_at_pos(x, y)
    if drop_info:
        path, position = drop_info
        my_iter = model.get_iter(path)
        if (position == Gtk.TreeViewDropPosition.BEFORE
            or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
            model.insert_before(my_iter, [data])
        else:
            model.insert_after(my_iter, [data])
    else:
        model.append([data])    
    if context.get_actions() == Gdk.DragAction.MOVE|Gdk.DragAction.DEFAULT:
        context.finish(True, True, time)
    return

这非常失败——当 Python 调用 Gtk.TreeDragSource.drag_data_get() 时,Python 崩溃并且我的程序窗口迅速消失。我什至没有到达 drag_data_received 处理程序。谁能给我一些示例代码来展示这些使用 TreeDragSource 和 TreeDragDest 接口的方法如何工作?非常感谢任何帮助!

4

1 回答 1

0

Gtk.tree_set_row_drag_data(selection, model, path)使用而不是result = Gtk.TreeDragSource.drag_data_get(path, selection) 因为您仍然使用它会不起作用Gtk.tree_get_row_drag_data(selection)吗?

于 2012-10-13T15:07:48.177 回答