python - 将应用程序创建的文件拖放到资源管理器窗口

标签 python windows wxpython wxwidgets

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

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

我如何使用 wxpython 完成此操作?有可能吗?

最佳答案

我在网上搜索得很辛苦,但也找不到执行此操作的方法。甚至 Robin Dunn 也说过,当数据被放入文件系统时,放置源应用程序对目标一无所知。但我想出了一个简单的方法来做到这一点,至少在 Windows 上是这样。我们只需将包含空 FileDataObject 的 DropSource 拖到资源管理器窗口中。由于没有数据,所有这一切只是将资源管理器窗口置于顶部,这使我们能够获得用户拖入的文件夹的路径。首先,确保在 ListCtrl 的父级的 __init__ def 中将事件绑定(bind)到 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 扩展。

祝你好运

迈克

关于python - 将应用程序创建的文件拖放到资源管理器窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128328/

相关文章:

python - 根据列表中的以下元素获取第一个元素的范围

c# - 程序 (c#) 运行提升,仍然无法访问某些文件

php - 如何从 PHP 执行批处理脚本

python - wxpython 没有 'adv'

python - PIL 切断了字母的顶部

python - ElasticSearch地理距离查询

Windows SED 命令 - 无需正则表达式的简单搜索和替换

python - 包装 staticText 的 wxPython 问题

python - 单击按钮时如何更改 wxpython gizmo LED 颜色

python - 有没有一种方法可以公平地实现 Brian Kernighan 的 Python 计数算法?