drag-data-получить сигнал, запущенный дважды python gtk3

#python #python-3.x #gtk #gtk3 #pygtk

#python #python-3.x #gtk #gtk3 #pygtk

Вопрос:

Я хочу, чтобы источник тоже был пунктом назначения. Я реализовал приведенные ниже сигналы, но сигнал drag-data-get срабатывает дважды. Во второй раз переменная данных (в on_drag_data_get) заполняется автоматически выбранным элементом ListStore.

 class DragSource(Gtk.TreeView):
    def __init__(self):
        Gtk.TreeView.__init__(self)

        model = Gtk.ListStore(str)
        self.set_model(model)
        self.add_item("Item 1")
        self.add_item("Item 2")
        self.add_item("Item 3")

        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Backlog", renderer, text=0)
        self.append_column(column)

        self.enable_model_drag_source(
            Gdk.ModifierType.BUTTON1_MASK, [], DRAG_ACTION)
        self.drag_dest_set(Gtk.DestDefaults.ALL, [], DRAG_ACTION)

        self.connect("drag-data-get", self.on_drag_data_get)
        self.connect("drag-data-received", self.on_drag_data_received)

    def on_drag_data_get(self, widget, drag_context, data, info, time):
        print("fired")
        model, iter = self.get_selection().get_selected()
        text = model.get_value(iter, 0)
        data.set_text(text, -1)

    def on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
        text = data.get_text()
        self.add_item(text)
        print("Received text: %s" % text)


    def add_item(self, text):
        self.get_model().append([text])
 

Ответ №1:

заменить

 self.drag_dest_set(Gtk.DestDefaults.ALL, [], DRAG_ACTION)
 

с

 dnd_list = [Gtk.TargetEntry.new("text/uri-list", 0, 80)]
self.drag_dest_set_target_list(dnd_list)
 

Комментарии:

1. Этот ответ был бы лучше, если бы в нем было объяснение приведенного здесь кода. Без объяснения причин этот ответ на самом деле не представляет ценности для пользователей, ищущих более подробную информацию.

Ответ №2:

У меня была такая же проблема, обработчик сигнала будет вызываться дважды,

чтобы исправить это, вы должны остановить распространение событий, вернув True из ваших обратных вызовов, например, on_drag_data_get и on_drag_data_received

минимальная демонстрация:

 import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def on_click(*args, **kwargs):
    print('clicked')
    return True  # to prevent event from propagation and stop event from being fired twice

win = Gtk.Window()
win.connect('button-press-event', on_click)
win.show_all()
Gtk.main()
 

спасибо этому комментарию