私はウェブをかなり一生懸命検索しましたが、これを行う方法も見つかりませんでした。Robin Dunn でさえ、データがファイル システムにドロップされるとき、ドロップ ソース アプリはターゲットについて何も知らないと言っています。しかし、少なくとも Windows では簡単な方法を見つけました。空の FileDataObject を含む DropSource を Explorer ウィンドウにドラッグするだけです。データがないため、エクスプローラー ウィンドウを一番上に移動するだけで、ユーザーがドラッグしたフォルダーへのパスを取得できます。__init__
最初に、ListCtrl の親の定義でイベントを 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 拡張機能が必要です。
幸運を、
マイク