MS Windows で実行されている wxPython アプリがあり、そのインスタンス間のドラッグ アンド ドロップをサポートしたい (したがって、ユーザーはアプリを 3 回開き、あるインスタンスから別のインスタンスにデータをドラッグします)。
wxPython での単純なドラッグ アンド ドロップは次のように機能します。
- ユーザーがドラッグを開始: ソース ウィンドウは、必要なデータを wx.DataObject() にパックし、新しい wx.DropSource を作成し、そのデータを設定して、dropSource.DoDragDrop() を呼び出します。
- ユーザーがデータをターゲット ウィンドウにドロップします。ドロップ ターゲットは、実際のデータをその wx.DataObject インスタンスに転送するライブラリ関数 GetData() を呼び出し、最後に - dataObject.GetData() が実際のデータをアンパックします。
ユーザーがドロップ後にドラッグするデータを選択できる、より洗練されたドラッグアンドドロップが必要です。私の夢
のシナリオ:
- ユーザーがドラッグを開始: ソース ウィンドウへのポインターのみがパックされます (関数またはオブジェクト)。
- ユーザーがターゲット ウィンドウにデータをドロップ: 適切なダイアログが表示され、どのドラッグ アンド ドロップ モードを選択するかをユーザーに尋ねます (曲のタイトルのみをドラッグするか、曲のタイトルとアーティスト名またはドラッグしたアーティストのアルバム全体をドラッグするかなど)。
- ユーザーがドラッグ アンド ドロップ モードを選択します。ドロップ ターゲットは、ドラッグされたデータ オブジェクトに対して何らかの関数を呼び出し、ドラッグ ソースからデータを取得してドロップ ターゲットに転送します。
私の夢のシナリオは MS Windows で実行可能に思えますが、wxWidgets と wxPython のドキュメントはかなり複雑で曖昧です。すべての wx.DataObject クラスが wxPython で利用できるわけではありません (wx.PySimpleDataObject のみ)。そのような動作は、winAPI で直接コーディングすることなく、wxPython で実装できますか?
編集: Toni Ruža は、ドラッグ & ドロップの例で答えを出しましたが、それはまさに私の夢のシナリオではありません。彼のコードはデータがドロップされたときにデータを操作しますが ( HandleDrop()はポップアップ メニューを表示します)、データはドラッグが開始されたときに準備されます ( On_ElementDrag()で)。私のアプリケーションでは、3 つの異なるドラッグ アンド ドロップ モードが必要であり、そのうちのいくつかは時間のかかるデータ準備が必要です。そのため、ユーザーがデータをドロップして (コストがかかる可能性がある) d&d モードを選択するまで、データの取得を延期したいと考えています。
また、メモリ保護の問題については、MS Office のように、プロセス間通信に OLE メカニズムを使用したいと考えています。Excel の図をコピーして、MS-Word に貼り付けると、画像のように動作します (まあまあ)。それが機能するので、winAPIで実行できると思います。wxPythonでコーディングできるかどうかわかりません。