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()
4 Réponses :
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()
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
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: le code de la La méthode "got_data_cb" ressemblerait alors à ceci: p> ceci scinderait les données par n'importe quel blanc et vous renvoie le premier élément. P> P>
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)
Le code suivant est porté de Un exemple du tutoriel (ancien) pygtk a> que je suppose inspiré La réponse acceptée , mais avec pygi: