画面上にファイルをドラッグ&ドロップすると、ファイル名が表示されるようなアプリケーションの実装
アプリケーションを立ち上げて、その画面にファイルをドラッグ&ドロップすると、画面にそのファイル名が表示されるような仕組みを、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)はドロップされた座標らしいが、ここではその情報は使っていない。