将由应用程序创建的文件拖放到Explorer窗口



我有一个listCtrl,其中包含一些代表(巨大和远程)文件的项目。我希望用户能够将项目拖到打开的目录窗口,从而创建文件(真正启动下载)。我希望我的应用程序获得一条消息,例如"用户将列表项目拖到此路径",以便我可以继续并将文件数据写入该位置。

我知道如果源文件在本地文件系统上可用,但是我的文件很大,并且在远程系统上(想想FTP客户端),这样我就不能推测地将它们复制到磁盘,以防万一想稍后再拖动它们。

如何使用wxpython完成此操作?甚至可能吗?

我很难搜索网络,但找不到这样做的方法。甚至罗宾·邓恩(Robin Dunn)也表示,当数据删除到文件系统中时,Drop源应用程序对目标一无所知。但是我想出了一种简单的方法,至少在窗户上。我们只需将装有一个空的FileDataObject的Dropsource拖到资源管理器窗口中。由于没有数据,所有这些都是将Explorer窗口带到顶部,这使我们能够获取用户拖入文件夹的路径。首先,请确保将事件绑定到ListCtrl父母的__init__ DEF中的ListCtrl:

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

然后在事件调用的方法中执行此操作:

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方法从ListCtrl获取所选项目,然后(在此应用中)将项目从REST服务器下载到Outdir。

当然,此解决方案需要Pywin32扩展。

祝你好运,

Mike

我不知道如何将其集成到WXPYTHON中,但是Shell支持许多用于复制文件的剪贴板格式。如果文件在网络驱动器上(例如,可以通过UNC路径访问),则可以使用与CF_Drop格式一样简单的内容。如果它并不那么容易,那么您将必须使用CFSTR_FIELDESCRIPTOR/CFSTR_FILECONTENTS格式。这是在C或C 中实施的真正琐事,所以我想这在Python中是双重的。但是,有人可能已经做了繁重的工作。您应该查看是否有一个Python库可以处理Shell剪贴板格式。

如果您可以在listCtrl中显示数据,则可以将列表项将其绑定到路径。就个人而言,我将使用ObjectListView,因为这使得这种事情变得更加容易。然后,当您进行拖放时,您可以取下对象并提取路径/URL。之后,您只需要使用适当的python库,例如ftplib或urllib下载文件。

由于您发现我的博客非常有帮助,我会指出其他一些可能对您有帮助的教程:

  • http://www.blog.pythonlibrary.org/2012/07/19/python-101-downloading-a-file-with-with-ftplib/
  • http://www.blog.pythonlibrary.org/2012/06/07/python-101-how-to-download-a-file/

最新更新