Я хочу перетащить видео с YouTube из веб-браузера в окно Gtk. Окно Gtk получает URL видео.
Тестовый скрипт ниже работает только в 20% случаев. Иногда окно Gtk получает желаемый URL в виде обычного текста. Большую часть времени он получает что-то вроде application / x-moz-file-promise-dest-filename (от Firefox) или chromium / x-renderer-taint (от Chromium).
Некоторые похожие скрипты работают 100% времени. Этот позволяет пользователю перетаскивать на Gtk.Label. Этот ответ позволяет пользователю перетаскивать на Gtk.TreeView. Предположительно перетаскивание на любой из этих виджетов отфильтровывает все, кроме URL, но это мне не помогает; У меня нет Gtk.Label или Gtk.TreeView.
Помимо перехода в Gtk.Window, я пробовал paneds, vboxes и listboxes с одинаковыми результатами. Я попытался использовать Gtk.Window.drag_dest_add_text_targets (), который полностью ломает скрипт.
РЕДАКТИРОВАТЬ: Исправление заключается в следующем.
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject
class DragDropWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='Drag and drop test')
self.set_default_size(400, 400)
# Set up drag and drop
# self.connect("drag-motion", self.motion_cb)
# self.connect("drag-drop", self.drop_cb)
self.connect("drag-data-received", self.got_data_cb)
# self.drag_dest_set(0, [], 0)
self.drag_dest_set_target_list(None)
self.drag_dest_add_text_targets()
# def motion_cb(self, wid, context, x, y, time):
# Gdk.drag_status(context,Gdk.DragAction.COPY, time)
# return True
# def drop_cb(self, wid, context, x, y, time):
# wid.drag_get_data(context, context.list_targets()[-1], time)
def got_data_cb(self, wid, context, x, y, data, info, time):
if info == 0:
text = data.get_text()
datatype = data.get_target()
print("Received text: %s" % text)
print("Data type: %s" % datatype)
context.finish(True, False, time)
win = DragDropWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()