これまでPython2.7でwxPythonを用いて、ファイルをドラッグアンドドロップで開くスクリプトを
書いて用いていた。Python3.8を使い始めて、改めてドラッグアンドドロップの部分を抜き出して、
動作を確認してみた。
環境は、Windows10 64bit, Python3.8.3, wxPython4.1.0。
tkinterにくらべて、ウィンドウ作成の部分に手間をかけているが、やっていることは以下の通り。
まず、wx.FileDropTargetを継承したクラスを作成して、
ファイルがドロップされた時に実行されるOnDropFiles()を
自分の望むように書き換える。
さらに、wx.PanelのSetDropTarget()メソッドを用いて、
作成したFileDropTargetを継承したクラスのインスタンスを設定するだけである。
実行すると、ウィンドウが開き、その中に配置されたパネルにファイルをドロップすると、
そのパスがコンソールに表示される。
import wx
class MyFileDropTarget(wx.FileDropTarget):
def __init__(self):
super(MyFileDropTarget, self).__init__()
def OnDropFiles(self, x, y, filenames):
for n in filenames:
print(x, y, n)
return True
class DropPanel(wx.Panel):
def __init__(self, parent, *args, **kwargs):
super(DropPanel, self).__init__(parent, *args, **kwargs)
self.droptarget = MyFileDropTarget()
self.SetDropTarget(self.droptarget)
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super(MyFrame, self).__init__(*args, **kwargs)
self.panel = DropPanel(self, size=(300, 300))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel, 1, wx.EXPAND)
self.SetSizer(sizer)
self.Fit()
class MyApp(wx.App):
def __init__(self):
wx.App.__init__(self, False)
def OnInit(self):
self.frame = MyFrame(None, title=AppName)
#self.SetTopWindow(self.frame)
self.frame.Show()
return True
if __name__ == '__main__':
AppName = "DnD Test"
app = MyApp()
app.MainLoop()