python - 如何将多个项目设置到 GtkSelection 中以进行 Treeview 拖放

标签 python drag-and-drop gtk gtk3 gtktreeview

我当前的项目使用 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 行之一的数据设置选择对象的所有努力都失败了。我的模型中的 intbool 值无法像字符串值一样进行编码,并且我找不到任何有关如何设置多列的所有值的示例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/

相关文章:

c - 如何将 GtkWidgets 发送到后面或前面?

python - 如何识别 SimPy 模拟中的耗时任务?

xcode - 拖放后窗口失去焦点

棋盘上的 java2D 棋子拖放

javascript - 为什么 event.clientX 在 firefox 中对于 dragend 事件错误地显示为 0?

c - gtk_source_undo_manager_begin_not_undoable_action/gtk_source_undo_manager_end_not_undoable_action 不工作

ssh - 错误 : XDG_RUNTIME_DIR not set in the environment. Gtk-WARNING **:无法打开显示:

Python:如何删除像素注释?

python - Gephi 脚本控制台不显示节点

python - 子类中重写的属性 setter 的特殊性