我有一个简单的 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 接口的方法如何工作?非常感谢任何帮助!