6
votes

Python GTK glisser-déposer - obtenez l'URL

Je crée une petite application doit pouvoir recevoir des URL. Si la fenêtre Apps est ouverte, je devrais être capable de faire glisser un lien d'un navigateur et de le déposer dans l'application - et l'application enregistrera l'URL à une base de données.

Je crée ceci à Python / GTK. Mais je suis un peu confus sur la fonctionnalité de la traînée et de la goutte. Alors, comment? P>

Quelque exemple de code pour implémenter glisser / goutte (mon application utilise un bit de ce code) ... p>

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


0 commentaires

4 Réponses :


8
votes

Vous devez aller chercher les données vous-même. Voici un exemple de travail simple qui définira une étiquette sur l'URL supprimée:

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


2 commentaires

Soyez prudent en ce que vous pourriez avoir à appeler data.get_uris () si les données se présentent sous la forme d'une liste URI. Donc, par exemple, si vous étiez dnd'ing une liste de fichiers de Konqueror / Nautilus à la fenêtre et que votre acceptation dit «Text / Uri-List ', Get_Data () sur le GTKSelectionData ne renverra aucun.


Il pourrait y avoir un comportement indésirable si nous faisons glisser sur la fenêtre et faites glisser la fenêtre de la fenêtre sans libérer la souris de l'étiquette de retenue du texte. Effacer l'étiquette semble avoir plus de sens



3
votes

Assurez-vous d'obtenir uniquement les données d'un fichier ou d'un répertoire sur DND'ing une liste de fichiers à partir de votre fichier Explorer, vous pouvez utiliser quelque chose comme: xxx

le code de la La méthode "got_data_cb" ressemblerait alors à ceci: xxx

ceci scinderait les données par n'importe quel blanc et vous renvoie le premier élément.


0 commentaires

1
votes

La seule solution qui fonctionne pour moi est la suivante:

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 commentaires

2
votes

0 commentaires