2012-03-11 61 views
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下工作呢?

回答

1

我從來沒有見過跨應用程序GTK + DnD在Windows中工作,除了從Windows資源管理器拖到GTK +應用程序。您可以使用PyGTK教程中的drag targets demo進行測試。 (即使從資源管理器中拖出也有一些奇怪的怪癖,例如不會觸發拖動)。

我認爲這只是非常錯誤或未實現。

+0

奇怪的是,即使從Windows資源管理器中拖動對我來說也不起作用,除非我拖動文件URI(與上面的拖動目標演示和我的代碼相同的問題)。我將在今天查看GTK源代碼以檢查它是如何實現的。 – Cito 2012-03-12 08:38:44

+1

現在看着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

相關問題