我当前的项目使用 Gtk.TreeView
来显示 ListView
的内容,每行四个字段、两个字符串、一个 int
和一个 bool 值。我正在尝试在 TreeView 中实现行的拖放重新排列。我不想简单地使用 TreeView.set_reorderable(True)
进行内置拖放,因为我希望对模型中数据的插入和删除以及能够实现拖放操作的撤消/重做。我正在使用 Python 3.2 和 PyGObject 3。
我现在遇到的问题是弄清楚如何在我的 drag_data_get
方法中使用两个字符串(一个 int 和一个 bool
)设置选择数据对象,这两个字符串使向上拖放的行。我能找到的所有示例代码都涉及带有单列的 TreeView ,其中的字符串值设置为选择,如下所示:
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 行之一的数据设置选择对象的所有努力都失败了。我的模型中的 int
和 bool
值无法像字符串值一样进行编码,并且我找不到任何有关如何设置多列的所有值的示例TreeView 行变成单个选择对象。谁能给我指出一些相关的示例或文档?
最佳答案
您可以将 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
不适合您,您也可以使用自己的编码方案。
请对通过这种方式获得的数据进行仔细的完整性检查。如果不这样做,某些特制的字符串(例如从另一个程序传递的)可能会使您的程序崩溃或更糟。
关于python - 如何将多个项目设置到 GtkSelection 中以进行 Treeview 拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13003915/