2012-10-29 79 views
4

我有一個ListCtrl,其中包含一些代表(巨大和遠程)文件的項目。我希望用戶能夠將項目拖到打開的目錄窗口中,從而創建一個文件(真正啓動下載)。我希望我的應用程序能夠得到類似「用戶將列表項目拖到此路徑中」的消息,以便我可以繼續並將文件數據寫入該位置。將應用程序創建的文件拖放到資源管理器窗口

我知道該怎麼做something similar如果源文件在本地文件系統上可用,但我的文件很大並且在遠程系統上(認爲是FTP客戶端),所以我不能推測性地將它們複製到磁盤,以防用戶想稍後拖動它們。

我該如何使用wxpython來完成這項工作?它甚至有可能嗎?

回答

3

我在網上搜索,很辛苦但無法找到一種方法來做到這一點。即使Robin Dunn說,當數據放入文件系統時,放置源應用程序對目標一無所知。但我想出了一個簡單的方法來做到這一點,至少在Windows上。我們只需將包含空白FileDataObject的DropSource拖動到資源管理器窗口。由於沒有數據,所有這些都會將瀏覽器窗口置於頂部,這樣我們就可以獲取用戶拖入的文件夾的路徑。首先,一定要在__init__高清的的ListCtrl的父的事件給的ListCtrl結合起來:

def onDrag(self, event): 
    data = wx.FileDataObject() 
    obj = event.GetEventObject() 
    dropSource = wx.DropSource(obj) 

    dropSource.SetData(data) 

    #next line will make the drop target window come to top, allowing us 
    #to get the info we need to do the work, if it's Explorer 
    result = dropSource.DoDragDrop(0) 

    #get foreground window hwnd 
    h = win32gui.GetForegroundWindow() 

    #get explorer location 
    s = win32com.client.Dispatch("Shell.Application") 
    loc, outdir = None, None 
    for w in s.Windows(): 
     if int(w.Hwnd) == h: 
      loc = w.LocationURL 
    if loc: 
     outdir = loc.split('///')[1] 
     outdir = urllib.unquote(outdir) 

    #got what we need, now download to outfol 
    if outdir and os.path.isdir(outdir): 
     self.dloadItems(event, outdir) 


    return 

的dloadItems方法獲取:

self.lc.Bind(wx.EVT_LIST_BEGIN_DRAG, self.onDrag) 

然後由事件調用的方法做到這一點從ListCtrl中選擇的項目然後(在此應用程序中)將項目從REST服務器下載到outdir。

這個解決方案當然需要pywin32擴展。

好運,

邁克

+0

它的實際工作!謝謝! –

+0

完整的例子在這裏https://github.com/alexbuz/wxPython-Drag-Out/blob/master/drag_out.py – olekb

1

我不知道如何將它整合到wxpython中,但是the shell supports a number of clipboard formats用於複製文件。如果這些文件位於網絡驅動器上(例如,可通過UNC路徑訪問),那麼您可以使用像CF_DROP格式一樣簡單的操作。如果它不那麼容易,那麼你將不得不使用CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS格式。這是一個用C或C++實現的真正的難題,所以我想它會在python中倍增。雖然有人可能已經完成了繁重的工作,你應該看看是否有一個python庫來處理shell剪貼板格式。

0

如果您可以在ListCtrl中顯示數據,那麼您可以將列表項綁定到路徑。就個人而言,我會使用ObjectListView,因爲這使得這種事情更容易。然後,當您執行拖放操作時,您可以取出掉落的對象並提取路徑/ URL。之後,您只需使用適當的Python庫,例如ftplib或urllib來下載文件。

既然你找到我的博客這樣的幫助,我將指出幾個其他教程,可以幫助你:

相關問題