我有一个ListCtrl包含一些代表(巨大和远程)文件的项目。 我希望用户能够拖动项目到打开的目录窗口,从而创build一个文件(真正启动下载)。 我希望我的应用程序能够得到类似于“用户将列表项目拖到此path”的消息,以便我可以继续并将文件数据写入该位置。
我知道如果源文件在本地文件系统上可用,但是我的文件很大,并且在远程系统上(如FTP客户端),所以我不能推测性地将它们复制到磁盘,以防用户想要拖动之后再来。
我怎样才能做到这一点使用wxpython? 这甚至有可能吗?
我很难搜索网络,但无法找到一种方法来做到这一点。 即使Robin Dunn说,当数据被丢弃到文件系统中时,drop source应用程序对目标一无所知。 但我想出了一个简单的方法来做到这一点,至少在Windows上。 我们只需将包含空的FileDataObject的DropSource拖到资源管理器窗口中。 由于没有数据,所有这些都会将Explorer窗口置于顶部,这样我们就可以获取用户拖入的文件夹的路径。 首先,请确保将事件绑定到ListCtrl的父级的__init__
def中:
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扩展。
祝你好运,
麦克风
我不知道如何将其整合到wxpython中,但是shell支持许多用于复制文件的剪贴板格式 。 如果这些文件位于网络驱动器上(例如通过UNC路径访问),那么可以使用像CF_DROP格式一样简单的操作。 如果不那么容易,那么你将不得不使用CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS格式。 这是用C或C ++实现的一个真正的麻烦,所以我想在python中会这样。 虽然有人可能已经完成了繁重的工作, 你应该看看是否有一个python库来处理shell剪贴板格式。
如果可以在ListCtrl中显示数据,则可以将列表项绑定到路径。 就个人而言,我会使用ObjectListView,因为这使得这种事情更容易。 然后当你做一个拖放,你可以把下落的对象,并提取路径/ URL。 之后,您只需要使用适当的Python库,例如ftplib或urllib来下载文件。
既然你发现我的博客很有帮助,我会指出一些其他的教程可以帮助你: