TreeView拖放在PyGObject中:drag-data-delete不被调用? [英] TreeView drag and drop in PyGObject: drag-data-delete not called?

查看:193
本文介绍了TreeView拖放在PyGObject中:drag-data-delete不被调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究如何在PyGObject中的TreeView中进行拖放操作。我有一些我不明白的东西:

I am working on an example how to do drag-and-drop in a TreeView in PyGObject. I have something I don't understand:


  • 为什么 drag_data_delete 调用?

  • Why is the drag_data_delete function never called?

这是自包含的例子:

from gi.repository import Gtk, Gdk

class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView Drag and Drop")
        self.connect("delete-event", Gtk.main_quit)
        self.set_border_width(10)
        self.set_default_size(400, 300)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.store = Gtk.TreeStore(bool, str)
        self.view = Gtk.TreeView(model=self.store)
        vbox.add(self.view)

        renderer_toggle = Gtk.CellRendererToggle()
        column_toggle = Gtk.TreeViewColumn("", renderer_toggle, active=0)
        renderer_toggle.connect("toggled", self.on_toggled)
        self.view.append_column(column_toggle)

        renderer_name = Gtk.CellRendererText()
        column_name = Gtk.TreeViewColumn("Name", renderer_name, text=1)
        self.view.append_column(column_name)

        self.view.connect("drag-begin", self.drag_begin)
        self.view.connect("drag-data-get", self.drag_data_get)
        self.view.connect("drag-drop", self.drag_drop)
        self.view.connect("drag-data-delete", self.drag_data_delete)
        self.view.connect("drag-data-received", self.drag_data_received)
        self.view.connect("drag-end", self.drag_end)

        targets = [("text/uri-list", 0, 0)]
        self.view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK,
            targets, Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE)
        self.view.enable_model_drag_dest(targets, Gdk.DragAction.DEFAULT)

        self.add_test_data()

    def add_test_data(self):
        parent = self.store.append(None, [True, "Item 1"])
        self.store.append(parent, [True, "Item 2"])
        self.store.append(None, [True, "Item 3"])
        self.store.append(None, [True, "Item 4"])

    def on_toggled(self, cellrenderer, path):
        self.store[path][0] = not self.store[path][0]

    def drag_begin(self, treeview, context):
        print("===================")
        print("Drag started")

    def drag_data_get(self, treeview, context, selection, info, time):
        print("===================")
        print("Drag data requested by destination")
        treeselection = treeview.get_selection()
        model, iter = treeselection.get_selected()
        data = bytes(model.get_value(iter, 1), "utf-8")
        selection.set(selection.get_target(), 8, data)

    def drag_drop(self, treeview, context, selection, info, time):
        print("===================")
        print("Drag data droped")

    def drag_data_received(self, treeview, context, x, y, selection, info, time):
        print("===================")
        print("Drag data received")
        drop_info = self.view.get_dest_row_at_pos(x, y)
        data = selection.get_data().decode("utf-8")
        if drop_info is not None:
            drop_path, drop_position = drop_info[0], drop_info[1]
            print(drop_position)
            drop_iter = self.store.get_iter(drop_path)
            #0=Before, 1=After, 2=INTO_OR_BEFORE, 3=INTO_OR_AFTER
            if drop_position == Gtk.TreeViewDropPosition.BEFORE:
                print("Droped before {}".format(drop_path))
                self.store.insert_before(None, drop_iter, [True, data])
            elif drop_position == Gtk.TreeViewDropPosition.AFTER:
                print("Droped after {}".format(drop_path))
                self.store.insert_after(None, drop_iter, [True, data])
            else:
                self.store.insert_after(drop_iter, None, [True, data])

    def drag_end(self, treeview, context):
        print("===================")
        print("Drag data end")

    def drag_data_delete(self, treeview, context):
        print("===================")
        print("Drag data delete")

win = MainWindow()
win.show_all()
Gtk.main()


推荐答案

我的印象是,您的功能中缺少几个步骤。您确实拥有的某些功能实际上也将返回True或False。

I have the impression that there are several steps missing from your functions. Some of those functions you do have, are actually expected to return True or False, too.

请查看我的教程在python的DGD,这是非常好的。您可以逐步了解如何实施该过程。

Please have a look at my tutorial on DnD in pyGtk, which works quite well. You can follow step-by-step how to implement the process.

这篇关于TreeView拖放在PyGObject中:drag-data-delete不被调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆