#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()
спасибо этому комментарию