Introduction

What Objects are Involved

Process Overview

wxDataObjects

Code Samples

# A very simple Drag and Drop Example
# provided with no warranty whatsoever for any purpose, ever

# This code creates a Text Control from which Text can be dragged,
# a Text Control to which Text can be dragged (from the first Text Control or from other applications),
# and a Text Control to which Files can be dragged from outside this application.
# While the later two windows can receive data from outside the application, the first window
# does not appear to be able to provide text to other applications.  Please feel free to fix
# this if you know how, as I think that would be more useful as an example.

# It is designed to demonstrate the fundamentals of very simple drag-and-drop operations.

""" This mini-ap is designed to demonstrate simple Drag and Drop functioning in wxPython """

__author__ = 'David Woods, Wisconsin Center for Education Research <dwoods@wcer.wisc.edu>'

# Import wxPython
from wxPython.wx import *

# Declare GUI Constants
MENU_FILE_EXIT = 101
DRAG_SOURCE    = 201

# Define Text Drop Target class
class TextDropTarget(wxTextDropTarget):
   """ This object implements Drop Target functionality for Text """
   def __init__(self, obj):
      """ Initialize the Drop Target, passing in the Object Reference to
          indicate what should receive the dropped text """
      # Initialize the wxTextDropTarget Object
      wxTextDropTarget.__init__(self)
      # Store the Object Reference for dropped text
      self.obj = obj

   def OnDropText(self, x, y, data):
      """ Implement Text Drop """
      # When text is dropped, write it into the object specified
      self.obj.WriteText(data + '\n\n')

# Define File Drop Target class
class FileDropTarget(wxFileDropTarget):
   """ This object implements Drop Target functionality for Files """
   def __init__(self, obj):
      """ Initialize the Drop Target, passing in the Object Reference to
          indicate what should receive the dropped files """
      # Initialize the wsFileDropTarget Object
      wxFileDropTarget.__init__(self)
      # Store the Object Reference for dropped files
      self.obj = obj

   def OnDropFiles(self, x, y, filenames):
      """ Implement File Drop """
      # For Demo purposes, this function appends a list of the files dropped at the end of the widget's text
      # Move Insertion Point to the end of the widget's text
      self.obj.SetInsertionPointEnd()
      # append a list of the file names dropped
      self.obj.WriteText("%d file(s) dropped at %d, %d:\n" % (len(filenames), x, y))
      for file in filenames:
         self.obj.WriteText(file + '\n')
      self.obj.WriteText('\n')



class MainWindow(wxFrame):
   """ This window displays the GUI Widgets. """
   def __init__(self,parent,id,title):
       wxFrame.__init__(self,parent,-4, title, size = (800,600), style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
       self.SetBackgroundColour(wxWHITE)

       # Menu Bar
       # Create a MenuBar
       menuBar = wxMenuBar()
       # Build a Menu Object to go into the Menu Bar
       menu1 = wxMenu()
       menu1.Append(MENU_FILE_EXIT, "E&xit", "Quit Application")
       # Place the Menu Item in the Menu Bar
       menuBar.Append(menu1, "&File")
       # Place the Menu Bar on the ap
       self.SetMenuBar(menuBar)
       #Define Events for the Menu Items
       EVT_MENU(self, MENU_FILE_EXIT, self.CloseWindow)

       # GUI Widgets
       # Define a Text Control from which Text can be dragged for dropping
       # Label the control
       wxStaticText(self, -1, "Text Drag Source  (left-click to select, right-click to drag)", (10, 1))
       # Create a Text Control
       self.text = wxTextCtrl(self, DRAG_SOURCE, "", pos=(10,15), size=(350,500), style = wxTE_MULTILINE|wxHSCROLL)
       # Make this control a Text Drop Target
       # Create a Text Drop Target object
       dt1 = TextDropTarget(self.text)
       # Link the Drop Target Object to the Text Control
       self.text.SetDropTarget(dt1)
       # Put some text in the control as a starting place to have something to copy
       for x in range(20):
          self.text.WriteText("This is line %d of some text to drag.\n" % x)
       # Define Right-Click as start of Drag
       EVT_RIGHT_DOWN(self.text, self.OnDragInit)

       # Define a Text Control to recieve Dropped Text
       # Label the control
       wxStaticText(self, -1, "Text Drop Target", (370, 1))
       # Create a read-only Text Control
       self.text2 = wxTextCtrl(self, -1, "", pos=(370,15), size=(410,235), style = wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY)
       # Make this control a Text Drop Target
       # Create a Text Drop Target object
       dt2 = TextDropTarget(self.text2)
       # Link the Drop Target Object to the Text Control
       self.text2.SetDropTarget(dt2)

       # Define a Text Control to recieve Dropped Files
       # Label the control
       wxStaticText(self, -1, "File Drop Target (from off application only)", (370, 261))
       # Create a read-only Text Control
       self.text3 = wxTextCtrl(self, -1, "", pos=(370,275), size=(410,235), style = wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY)
       # Make this control a File Drop Target
       # Create a File Drop Target object
       dt3 = FileDropTarget(self.text3)
       # Link the Drop Target Object to the Text Control
       self.text3.SetDropTarget(dt3)

       # Display the Window
       self.Show(true)


   def CloseWindow(self, event):
       """ Close the Window """
       self.Close()

   def OnDragInit(self, event):
       """ Begin a Drag Operation """
       # Create a Text Data Object, which holds the text that is to be dragged
       tdo = wxPyTextDataObject(self.text.GetStringSelection())
       # Create a Drop Source Object, which enables the Drag operation
       tds = wxDropSource(self.text)
       # Associate the Data to be dragged with the Drop Source Object
       tds.SetData(tdo)
       # Intiate the Drag Operation
       tds.DoDragDrop(True)



class MyApp(wxApp):
   """ Define the Drag and Drop Example Application """
   def OnInit(self):
      """ Initialize the Application """
      # Declare the Main Application Window
      frame = MainWindow(None, -1, "Drag and Drop Example")
      # Show the Application as the top window
      self.SetTopWindow(frame)
      return true
      

# Declare the Application and start the Main Loop
app = MyApp(0)
app.MainLoop()

- David K. Woods, Wisconsin Center for Education Research, University of Wisconsin, Madison

(If you like this example, there's another, more complex example of Drag and Drop behavior in the ListAndTreeControls section.)

Comments...

I will add a example for dragging items in a wxTreeCtrl and what is more interresting how to drag a branch in a wxTreeCtrl. if added it will be found under ListAndTreeControls.

--René Freund


NOTE: To edit pages in this wiki you must be a member of the TrustedEditorsGroup.