2009-08-02 13 views
4

Je crée une petite application doit être en mesure de recevoir des URL. Si la fenêtre des applications est ouverte, je devrais pouvoir faire glisser un lien depuis un navigateur et le déposer dans l'application - et l'application enregistrera l'URL dans une base de données. Je crée ceci en Python/GTk. Mais je suis un peu confus au sujet de la fonctionnalité glisser-déposer. Alors, comment le faire?Python GTK glisser et déposer - Obtenir l'URL

Quelques exemples de code pour mettre en œuvre glisser/déposer (mon application utilise un peu de ce code) ...

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

Répondre

8

Vous devez récupérer les données vous-même. Voici un exemple de travail simple qui établira une étiquette à l'url tombé:

#!/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

Attention à ce que vous pourriez avoir à appelez data.get_uris() si les données sont sous la forme d'une liste d'uri. Ainsi, par exemple, si vous étiez en train de DnD une liste de fichiers de konqueror/nautilus à la fenêtre et que vous acceptez 'text/uri-list', get_data() sur GtkSelectionData retournera None. –

+0

Il peut y avoir un comportement indésirable si nous traînons sur la fenêtre et faites glisser la fenêtre de la fenêtre sans relâcher la souris de l'étiquette en conservant le texte. Effacer l'étiquette semble avoir plus de sens – demongolem

3

Pour être sûr d'obtenir uniquement les données d'un fichier ou un répertoire sur DnD'ing une liste de fichiers de votre explorateur de fichiers, vous pourriez utiliser quelque chose comme:

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

le code pour la méthode « got_data_cb » doit ressembler à ceci:

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) 

cela diviserait les données par les espaces blancs et retourne le premier élément.

1

La seule solution de travail pour moi:

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

Le code suivant est porté à partir an example of the (old) PyGTK tutorial que je suppose inspiré the accepted answer, mais avec 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()