2009-08-02 9 views
4

Ich erstelle eine kleine App muss URLs empfangen können. Wenn das Apps-Fenster geöffnet ist, sollte ich in der Lage sein, einen Link von einem Browser zu ziehen und in die App zu legen - und die App wird die URL in einer Datenbank speichern.Python GTK Drag & Drop - Get URL

Ich erstelle das in Python/GTk. Aber ich bin etwas verwirrt über die Drag-and-Drop-Funktionalität darin. Also, wie?

Einige Beispielcode per Drag/Drop (meine App nutzt ein bisschen dieses Codes) ...

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() 

Antwort

8

Sie müssen holen die Daten selbst implementieren. Hier ist ein einfaches Ausführungsbeispiel, das ein Etikett auf die URL gesetzt wird 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() 
+8

dass Vorsicht in die Sie haben könnten, um Rufen Sie data.get_uris() auf, wenn die Daten in Form einer uri-Liste vorliegen. Wenn Sie zum Beispiel eine Liste von Dateien von Konqueror/Nautilus an das Fenster senden und Ihre Annahme "text/uri-list" sagen, gibt get_data() für GtkSelectionData None zurück. –

+0

Es kann ein unerwünschtes Verhalten geben, wenn wir auf das Fenster ziehen und das Fensterfenster ziehen, ohne die Maus der Beschriftung loszulassen, die den Text enthält. Das Löschen des Labels scheint mehr Sinn zu ergeben – demongolem

3

Um sicherzugehen, nur die Daten einer Datei oder ein Verzeichnis zu erhalten auf DnD'ing eine Liste von Dateien aus der Datei-Explorer, könnten Sie verwenden Sie so etwas wie:

data.get_text().split(None,1)[0] 

der Code für die „got_data_cb“ -Methode dann würde 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) 

Damit werden die Daten durch Leerzeichen geteilt würde und kehrt das erste Element.

1

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) 
0

Der folgende Code wird von an example of the (old) PyGTK tutorial portiert, die ich the accepted answer inspirierte Vermutung, 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()