4
Evernote客戶端具有很好的功能,可以將鏈接從Firefox拖動到Evernote編輯窗口中,該編輯窗口可與瀏覽器窗口中的書籤和鏈接一起使用。我想爲PyGTK應用程序添加一個類似的功能。以下是我試過到目前爲止(用py 2.7.2和PyGTK的2.24.0):如何將鏈接拖到Windows下的PyGTK應用程序中?
import pygtk
pygtk.require('2.0')
import gtk,pango
flags = gtk.TARGET_OTHER_APP
targets = [
('text/uri-list', flags, 0),
('text/plain', flags, 1),
('text/x-uri', flags, 2),
('text/x-moz-url', flags, 3),
('application/x-bookmark', flags, 4),
('application/x-mswinurl', flags, 5),
('application/x-desktop', flags, 6)]
def receive_data(wid, context, x, y, data, info, time):
type = data.type
url = data.data
if info == 2:
url = url.decode('utf-16')
url = url.splitlines()[0]
text = '%s\n%s' % (type, url)
label.set_text(text)
context.finish(True, False, time)
window = gtk.Window()
window.set_size_request(400, 80)
label = gtk.Label()
label.set_justify(gtk.JUSTIFY_CENTER)
label.set_ellipsize(pango.ELLIPSIZE_END)
window.add(label)
window.drag_dest_set(gtk.DEST_DEFAULT_ALL, targets,
gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE)
window.connect('drag_data_received', receive_data)
window.connect('destroy', lambda window: gtk.main_quit())
window.show_all()
gtk.main()
這很好地工作在Linux下:你可以拖放從Firefox鏈接或書籤的GTK窗口,它顯示拖動的URL。不幸的是,它在Windows下無法使用。我已經使用Windows 7進行了測試。這裏,上述應用程序只接受文件鏈接,但不接受來自Firefox或其他網絡瀏覽器的Internet鏈接。是否有可能使它在Windows下工作呢?
奇怪的是,即使從Windows資源管理器中拖動對我來說也不起作用,除非我拖動文件URI(與上面的拖動目標演示和我的代碼相同的問題)。我將在今天查看GTK源代碼以檢查它是如何實現的。 – Cito 2012-03-12 08:38:44
現在看着GTK +源代碼。看起來你是對的,Windows的DND實現似乎是不完整的。特別是,它只檢查文件被拖放時使用的WM_DROPFILES消息,它解釋了觀察到的行爲。我還發現可以設置'GDK_WIN32_USE_EXPERIMENTAL_OLE2_DND' env變量來啓用一些實驗性的OLE2 DND功能。當我這樣做時,我可以放棄超鏈接到GTK窗口,但只調用'drag_drop'回調,而不是'drag_data_received'回調,所以我無法訪問丟棄的URL。 – Cito 2012-03-12 10:14:10