4

(巨大でリモートの) ファイルを表すいくつかの項目を含む ListCtrl があります。ユーザーがアイテムを開いているディレクトリ ウィンドウにドラッグして、それによってファイルを作成できるようにしたいと思います (実際にダウンロードを開始します)。アプリケーションで「ユーザーがリスト アイテムをこのパスにドラッグしました」などのメッセージを受け取り、ファイル データをその場所に書き込めるようにしたいと考えています。

ソースファイルがローカルファイルシステムで利用可能な場合に同様のことを行う方法を知っていますが、私のファイルは大きく、リモートシステム (FTP クライアントを考えてください) にあるため、ユーザーがドラッグしたい場合にそれらをディスクに投機的にコピーすることはできません。後でドロップします。

wxpythonを使用してこれを達成するにはどうすればよいですか? それは可能ですか?

4

3 に答える 3

4

私はウェブをかなり一生懸命検索しましたが、これを行う方法も見つかりませんでした。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 拡張機能が必要です。

幸運を、

マイク

于 2012-12-14T15:11:18.027 に答える
1

これを wxpython に統合する方法はわかりませんが、シェルはファイルをコピーするための多数のクリップボード形式をサポートしています。ファイルがネットワーク ドライブ上にある場合 (たとえば、UNC パス経由でアクセスできる場合)、CF_DROP 形式のような単純なものを使用できます。それほど簡単でない場合は、CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS 形式を使用する必要があります。これは C や C++ で実装するのは本当に面倒なので、Python では 2 倍になると思います。ただし、誰かがすでに重いものを持ち上げている可能性があります。シェル クリップボード形式を処理する Python ライブラリがあるかどうかを確認する必要があります。

于 2012-10-29T20:18:22.310 に答える
0

ListCtrl にデータを表示できる場合は、リスト項目をパスに関連付けることができます。個人的には、ObjectListView を使用すると、この種の作業がさらに簡単になります。次に、ドラッグ アンド ドロップを行うと、ドロップされたオブジェクトを取得して、パス / URL を抽出できます。その後、ftplib や urllib などの適切な Python ライブラリを使用してファイルをダウンロードするだけです。

私のブログがとても役に立ったと思ったので、役立つかもしれない他のチュートリアルをいくつか紹介します。

于 2012-10-29T20:57:36.330 に答える