2009-08-02 66 views
4

我創建一個小應用程序必須能夠接收URL。如果應用程序窗口是打開的,我應該能夠從瀏覽器中拖動鏈接並將其放入應用程序 - 應用程序會將URL保存到數據庫。Python GTK拖放 - 獲取URL

我在Python/GTk中創建了這個。但是我對它的拖放功能有些困惑。那麼,它是如何呢?

一些示例代碼來實現拖/放(我的應用程序,使用比特這段代碼的)...

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

回答

8

您必須自己獲取數據。這裏有一個簡單的工作示例,將標籤設置爲網址下降:

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

是,你可能要小心如果數據是以uri列表的形式調用data.get_uris()。例如,如果你是從konqueror/nautilus到窗口的文件列表中,並且接受了'text/uri-list'的話,GtkSelectionData上的get_data()將返回None。 – 2009-08-31 21:41:11

3

就一定要得到您的文件瀏覽器DnD'ing文件的列表中的一個文件或目錄的只有數據,你可以使用類似:

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

了代號爲「got_data_cb」方法則是這樣的:

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) 

這將通過任何空格分割數據,並返回你的第一個項目。

1

工作對我來說唯一的解決辦法是:

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

下面的代碼是從an example of the (old) PyGTK tutorial我猜啓發the accepted answer移植,但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()