wxPython: Dragging a file into window to get file path
Question: I want to drag a file into a window and get the file path. I've tried doing
this:

    
    
    class CSVDropper(wx.FileDropTarget):
      def __init__(self, data):
          wx.FileDropTarget.__init__(self)
          self.data = data
    
      def OnDropFiles(self, x, y, filenames):
          self.data = filenames
          print self.data
    

then in the main window:

    
    
        # Drag & Drop
        self.csv_path = None
        self.drop_table = CSVDropper(self.csv_path)
    
        self.SetDropTarget(self.drop_table)
    

But this does nothing. I've tried running
[this](http://wiki.wxpython.org/DragAndDrop) tutorial code, but it doesn't do
anything either. How do I accomplish this?


Answer: When you print `self.data`, you should see a list of paths printed out.
Anyway, I wrote up a
[tutorial](http://www.blog.pythonlibrary.org/2012/06/20/wxpython-introduction-
to-drag-and-drop/) on drag-n-drop a while ago which shows how to do this.
Here's a slightly modified version of my code that both prints out the file
paths to stdout and to a text control too:

    
    
    import wx
    
    ########################################################################
    class MyFileDropTarget(wx.FileDropTarget):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, window):
            """Constructor"""
            wx.FileDropTarget.__init__(self)
            self.window = window
    
        #----------------------------------------------------------------------
        def OnDropFiles(self, x, y, filenames):
            """
            When files are dropped, write where they were dropped and then
            the file paths themselves
            """
            self.window.SetInsertionPointEnd()
            self.window.updateText("\n%d file(s) dropped at %d,%d:\n" %
                                  (len(filenames), x, y))
            print filenames
            for filepath in filenames:
                self.window.updateText(filepath + '\n')    
    
    ########################################################################
    class DnDPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent=parent)
    
            file_drop_target = MyFileDropTarget(self)
            lbl = wx.StaticText(self, label="Drag some files here:")
            self.fileTextCtrl = wx.TextCtrl(self,
                                            style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY)
            self.fileTextCtrl.SetDropTarget(file_drop_target)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(lbl, 0, wx.ALL, 5)
            sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5)
            self.SetSizer(sizer)
    
        #----------------------------------------------------------------------
        def SetInsertionPointEnd(self):
            """
            Put insertion point at end of text control to prevent overwriting
            """
            self.fileTextCtrl.SetInsertionPointEnd()
    
        #----------------------------------------------------------------------
        def updateText(self, text):
            """
            Write text to the text control
            """
            self.fileTextCtrl.WriteText(text)
    
    ########################################################################
    class DnDFrame(wx.Frame):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            wx.Frame.__init__(self, parent=None, title="DnD Tutorial")
            panel = DnDPanel(self)
            self.Show()
    
    #----------------------------------------------------------------------
    if __name__ == "__main__":
        app = wx.App(False)
        frame = DnDFrame()
        app.MainLoop()
    

