画面上にファイルをドラッグ&ドロップすると、ファイル名が表示されるようなアプリケーションの実装

アプリケーションを立ち上げて、その画面にファイルをドラッグ&ドロップすると、画面にそのファイル名が表示されるような仕組みを、wxPythonで実装したい。
そのためには、wx.FileDropTargetクラスを使えばよい。例えば、下記のコードのように書ける。

import wx

class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.window = window   #ファイルをドロップする対象

    def OnDropFiles(self, x, y, filenames):  #ファイルをドロップするときの処理
        for file in filenames:
            self.window.text.SetValue(file)

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Drop Target",
                          size=(500, 200))
        p = wx.Panel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)

        label = wx.StaticText(p, -1, "File name:")
        self.text = wx.TextCtrl(p, -1, "", size=(400,-1))
        sizer.Add(label, 0, wx.ALL, 5)
        sizer.Add(self.text, 0, wx.ALL, 5)
        p.SetSizer(sizer)

        dt = MyFileDropTarget(self)  #ドロップする対象をこのフレーム全体にする
        self.SetDropTarget(dt)

app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()

このコードを実行したときに起動する画面は、以下の通り。

コードの中で、ファイルをドロップする対象と、ドロップしたときの動作を定義している。ファイルをドロップしたときの画面表示は以下の通り。

ドロップする対象の定義

この場合、フレーム全体を対象とする(つまり、フレームのどこかにファイルをドロップすれば、アクションを実行する)ので、selfとしている。

dt = MyFileDropTarget(self)
self.SetDropTarget(dt)

ファイル名が書かれるウィジェット部分、つまりwx.TextCtrlを対象とする場合(wx.TextCtrlの部分にドロップすれば、アクションを実行する)には、

dt = MyFileDropTarget(self.text)
self.text.SetDropTarget(dt)

とすればよい。

ドロップされたときのアクション

ドロップ時のアクションは、OnDropFilesメソッドで定義する。

    def OnDropFiles(self, x, y, filenames):
        for file in filenames:
            self.window.text.SetValue(file)

ドロップされたファイル名はリストfilenamesに入れられている(複数のファイルをドロップするのに対応)。ここで作成したサンプルコードは、複数のファイルをドロップすることを想定していない。(x,y)はドロップされた座標らしいが、ここではその情報は使っていない。