Python GTK Drag and Drop - Get URL
-
10-07-2019 - |
Frage
Ich erstelle eine kleine Anwendung muss in der Lage sein, URLs zu erhalten. Wenn die Apps Fenster geöffnet ist, sollte ich in der Lage sein, einen Link von einem Browser zu ziehen und es in die App fallen -. Und die App wird die URL in einer Datenbank speichern
Ich schaffe dies in Python / GTK. Aber ich bin ein wenig verwirrt über die Drag-and-Drop-Funktionalität in ihm. So, wie es tun?
Einige Beispielcode per Drag / Drop (meine App nutzt ein bisschen dieses Codes) ...
zu implementierenimport pygtk
pygtk.require('2.0')
import gtk
# function to print out the mime type of the drop item
def drop_cb(wid, context, x, y, time):
l.set_text('\n'.join([str(t) for t in context.targets]))
# What should I put here to get the URL of the link?
context.finish(True, False, time)
return True
# Create a GTK window and Label, and hook up
# drag n drop signal handlers to the window
w = gtk.Window()
w.set_size_request(200, 150)
w.drag_dest_set(0, [], 0)
w.connect('drag_drop', drop_cb)
w.connect('destroy', lambda w: gtk.main_quit())
l = gtk.Label()
w.add(l)
w.show_all()
# Start the program
gtk.main()
Lösung
Sie müssen die Daten selbst holen. Hier ist ein einfaches Ausführungsbeispiel, das eine Beschriftung eingestellt wird auf die URL fallen gelassen:
#!/usr/local/env python
import pygtk
pygtk.require('2.0')
import gtk
def motion_cb(wid, context, x, y, time):
l.set_text('\n'.join([str(t) for t in context.targets]))
context.drag_status(gtk.gdk.ACTION_COPY, time)
# Returning True which means "I accept this data".
return True
def drop_cb(wid, context, x, y, time):
# Some data was dropped, get the data
wid.drag_get_data(context, context.targets[-1], time)
return True
def got_data_cb(wid, context, x, y, data, info, time):
# Got data.
l.set_text(data.get_text())
context.finish(True, False, time)
w = gtk.Window()
w.set_size_request(200, 150)
w.drag_dest_set(0, [], 0)
w.connect('drag_motion', motion_cb)
w.connect('drag_drop', drop_cb)
w.connect('drag_data_received', got_data_cb)
w.connect('destroy', lambda w: gtk.main_quit())
l = gtk.Label()
w.add(l)
w.show_all()
gtk.main()
Andere Tipps
Um sicherzustellen, dass nur die Daten einer Datei oder ein Verzeichnis erhalten auf eine Liste von Dateien aus der Datei-Explorer DnD'ing, Sie so etwas wie verwenden:
data.get_text().split(None,1)[0]
Sie den Code für die "got_data_cb" Methode würde dann wie folgt aussehen:
def got_data_cb(wid, context, x, y, data, info, time):
# Got data.
l.set_text(data.get_text().split(None,1)[0])
context.finish(True, False, time)
Dies würde die Daten durch Leerzeichen geteilt und kehrt das erste Element.
Die einzige Lösung für mich zu arbeiten ist:
def got_data_cb(wid, context, x, y, data, info, time):
# Got data.
l.set_text(data.get_uris()[0])
context.finish(True, False, time)
Der folgende Code wird portiert von ein Beispiel für die (alte) PyGTK Tutorial , die ich inspiriert die Antwort akzeptiert, aber mit pYGI:
#!/usr/local/env python
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk
def motion_cb(wid, context, x, y, time):
Gdk.drag_status(context, Gdk.DragAction.COPY, time)
return True
def drop_cb(wid, context, x, y, time):
l.set_text('\n'.join([str(t) for t in context.list_targets()]))
context.finish(True, False, time)
return True
w = Gtk.Window()
w.set_size_request(200, 150)
w.drag_dest_set(0, [], 0)
w.connect('drag-motion', motion_cb)
w.connect('drag-drop', drop_cb)
w.connect('destroy', lambda w: Gtk.main_quit())
l = Gtk.Label()
w.add(l)
w.show_all()
Gtk.main()