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 implementieren
import 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()
War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top