【问题标题】:Drag and drop application-created file to explorer window将应用程序创建的文件拖放到资源管理器窗口
【发布时间】:2012-10-19 03:54:41
【问题描述】:

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

如果源文件在本地文件系统上可用,我知道该怎么做something similar,但我的文件很大并且在远程系统上,(想想 FTP 客户端)所以我不能推测性地将它们复制到磁盘以防万一用户想稍后拖放它们。

我怎样才能使用 wxpython 完成这个?有可能吗?

【问题讨论】:

    标签: python windows wxpython wxwidgets


    【解决方案1】:

    我在网上搜索得很辛苦,但也找不到这样做的方法。甚至 Robin Dunn 都表示,当数据被放入文件系统时,drop source 应用程序对目标一无所知。但我想出了一个简单的方法,至少在 Windows 上是这样。我们只需将包含空 FileDataObject 的 DropSource 拖到资源管理器窗口上。由于没有数据,所有这一切都是将资源管理器窗口带到顶部,这使我们能够获取用户拖入的文件夹的路径。首先,一定要将事件绑定到 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 扩展。

    祝你好运,

    迈克

    【解决方案2】:

    如果您可以在 ListCtrl 中显示数据,那么您可以将列表项绑定到路径。就个人而言,我会使用 ObjectListView ,因为这会使这类事情变得更容易。然后,当您进行拖放时,您可以取出放置的对象并提取路径/ URL。之后,您只需要使用相应的 Python 库,例如 ftplib 或 urllib 即可下载文件。

    既然您发现我的博客对您很有帮助,我将指出一些其他可能对您有所帮助的教程:

    【讨论】:

      【解决方案3】:

      我不知道如何将它集成到 wxpython 中,但 the shell supports a number of clipboard formats 用于复制文件。如果文件位于网络驱动器上(例如,可通过 UNC 路径访问),那么您可以使用像 CF_DROP 格式这样简单的东西。如果没有那么简单,那么您将不得不使用 CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS 格式。这是在 C 或 C++ 中实现的真正苦差事,所以我想它在 python 中会加倍。不过,可能有人已经完成了繁重的工作;你应该看看是否有一个 python 库来处理 shell 剪贴板格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 2011-04-02
        • 1970-01-01
        • 2011-04-01
        • 2020-10-29
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多