如何将多个项目设置为Treeview拖放的GtkSelection

时间:2012-10-22 01:24:53

标签: python drag-and-drop gtk gtk3 gtktreeview

我当前的项目使用Gtk.TreeView来显示ListView的内容,每行有四个字段,两个字符串,一个int和一个boolean。我正在尝试在TreeView中实现拖放行的重新排列。我不想简单地使用TreeView.set_reorderable(True)进行内置拖放操作,因为我希望能够控制从模型中插入和删除数据,以及能够实现撤消/重做拖放操作。我正在使用Python 3.2和PyGObject 3。

我现在遇到的问题是弄清楚我的drag_data_get方法如何用两个字符串设置选择数据对象,一个int和一个bool构成要拖动的行然后放弃了。我能够找到的所有示例代码都涉及具有单个列的树视图,其中字符串值可以通过以下内容设置到选择中:

def drag_data_get_data(self, treeview, context, selection, target_id, etime):
    treeselection = treeview.get_selection()
    model, iter = treeselection.get_selected()
    data = bytes(model.get_value(iter, 0), "utf-8")
    selection.set(selection.get_target(), 8, data)

我用我的一个TreeView行中的数据设置选择对象的所有努力都失败了。我的模型中的intbool值不能像字符串值一样编码,我找不到如何将多列TreeView行的所有值设置为单个选择的任何示例宾语。任何人都可以向我指出一些相关的例子或文档吗?

1 个答案:

答案 0 :(得分:1)

您可以将4个值的元组编码为单个字符串。一种简单的方法是使用json

import json
data = ["string", "string2", True, 20]
string_variable = json.dumps(data)
#
# now pass string_variable through drag and drop
#
returned = json.loads(string_variable)

如果您无法选择导入json,也可以使用自己的编码方案。

请仔细检查您获得的数据。如果你不这样做,一些特制的字符串(比如从另一个程序传来)可能会使程序崩溃或更糟。