2 from wxPython
.wx 
import * 
   4 #---------------------------------------------------------------------- 
   6 class ClipTextPanel(wxPanel
): 
   7     def __init__(self
, parent
, log
): 
   8         wxPanel
.__init
__(self
, parent
, -1) 
  11         #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false)) 
  13         sizer 
= wxBoxSizer(wxVERTICAL
) 
  14         sizer
.Add(wxStaticText(self
, -1, 
  15                                "Copy/Paste text to/from\n" 
  16                                "this window and other apps"), 0, wxEXPAND|wxALL
, 2) 
  18         self
.text 
= wxTextCtrl(self
, -1, "", style
=wxTE_MULTILINE|wxHSCROLL
) 
  19         sizer
.Add(self
.text
, 1, wxEXPAND
) 
  21         hsz 
= wxBoxSizer(wxHORIZONTAL
) 
  22         hsz
.Add(wxButton(self
, 6050, " Copy "), 1, wxEXPAND|wxALL
, 2) 
  23         hsz
.Add(wxButton(self
, 6051, " Paste "), 1, wxEXPAND|wxALL
, 2) 
  24         sizer
.Add(hsz
, 0, wxEXPAND
) 
  25         sizer
.Add(wxButton(self
, 6052, " Copy Bitmap "), 0, wxEXPAND|wxALL
, 2) 
  27         EVT_BUTTON(self
, 6050, self
.OnCopy
) 
  28         EVT_BUTTON(self
, 6051, self
.OnPaste
) 
  29         EVT_BUTTON(self
, 6052, self
.OnCopyBitmap
) 
  31         self
.SetAutoLayout(true
) 
  35     def OnCopy(self
, evt
): 
  36         self
.do 
= wxTextDataObject() 
  37         self
.do
.SetText(self
.text
.GetValue()) 
  39         wxTheClipboard
.SetData(self
.do
) 
  40         wxTheClipboard
.Close() 
  43     def OnPaste(self
, evt
): 
  44         do 
= wxTextDataObject() 
  46         success 
= wxTheClipboard
.GetData(do
) 
  47         wxTheClipboard
.Close() 
  49             self
.text
.SetValue(do
.GetText()) 
  51             wxMessageBox("There is no data in the clipboard in the required format", 
  54     def OnCopyBitmap(self
, evt
): 
  55         dlg 
= wxFileDialog(self
, "Choose a bitmap to copy", wildcard
="*.bmp") 
  56         if dlg
.ShowModal() == wxID_OK
: 
  57             bmp 
= wxBitmap(dlg
.GetFilename(), wxBITMAP_TYPE_BMP
) 
  58             bmpdo 
= wxBitmapDataObject(bmp
) 
  60             wxTheClipboard
.SetData(bmpdo
) 
  61             wxTheClipboard
.Close() 
  63             wxMessageBox("The bitmap is now in the Clipboard.  Switch to a graphics\n" 
  64                          "editor and try pasting it in...") 
  67 #---------------------------------------------------------------------- 
  69 class OtherDropTarget(wxPyDropTarget
): 
  70     def __init__(self
, window
, log
): 
  71         wxPyDropTarget
.__init
__(self
) 
  73         self
.do 
= wxFileDataObject() 
  74         self
.SetDataObject(self
.do
) 
  76     def OnEnter(self
, x
, y
, d
): 
  77         self
.log
.WriteText("OnEnter: %d, %d, %d\n" % (x
, y
, d
)) 
  80     #def OnDragOver(self, x, y, d): 
  81     #    self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d)) 
  85         self
.log
.WriteText("OnLeave\n") 
  87     def OnDrop(self
, x
, y
): 
  88         self
.log
.WriteText("OnDrop: %d %d\n" % (x
, y
)) 
  91     def OnData(self
, x
, y
, d
): 
  92         self
.log
.WriteText("OnData: %d, %d, %d\n" % (x
, y
, d
)) 
  94         self
.log
.WriteText("%s\n" % self
.do
.GetFilenames()) 
 100 class MyFileDropTarget(wxFileDropTarget
): 
 101     def __init__(self
, window
, log
): 
 102         wxFileDropTarget
.__init
__(self
) 
 106     def OnDropFiles(self
, x
, y
, filenames
): 
 107         self
.window
.SetInsertionPointEnd() 
 108         self
.window
.WriteText("\n%d file(s) dropped at %d,%d:\n" % 
 109                               (len(filenames
), x
, y
)) 
 110         for file in filenames
: 
 111             self
.window
.WriteText(file + '\n') 
 114 class MyTextDropTarget(wxTextDropTarget
): 
 115     def __init__(self
, window
, log
): 
 116         wxTextDropTarget
.__init
__(self
) 
 120     def OnDropText(self
, x
, y
, text
): 
 121         self
.window
.WriteText("(%d, %d)\n%s\n" % (x
, y
, text
)) 
 123     def OnDragOver(self
, x
, y
, d
): 
 127 class FileDropPanel(wxPanel
): 
 128     def __init__(self
, parent
, log
): 
 129         wxPanel
.__init
__(self
, parent
, -1) 
 131         #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false)) 
 133         sizer 
= wxBoxSizer(wxVERTICAL
) 
 134         sizer
.Add(wxStaticText(self
, -1, " \nDrag some files here:"), 
 135                   0, wxEXPAND|wxALL
, 2) 
 137         self
.text 
= wxTextCtrl(self
, -1, "", 
 138                                style 
= wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY
) 
 139         dt 
= MyFileDropTarget(self
, log
) 
 140         self
.text
.SetDropTarget(dt
) 
 141         sizer
.Add(self
.text
, 1, wxEXPAND
) 
 143         sizer
.Add(wxStaticText(self
, -1, " \nDrag some text here:"), 
 144                   0, wxEXPAND|wxALL
, 2) 
 145         self
.text2 
= wxTextCtrl(self
, -1, "", 
 146                                style 
= wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY
) 
 147         dt 
= MyTextDropTarget(self
.text2
, log
) 
 148         self
.text2
.SetDropTarget(dt
) 
 149         sizer
.Add(self
.text2
, 1, wxEXPAND
) 
 151         self
.SetAutoLayout(true
) 
 155     def WriteText(self
, text
): 
 156         self
.text
.WriteText(text
) 
 158     def SetInsertionPointEnd(self
): 
 159         self
.text
.SetInsertionPointEnd() 
 162 #---------------------------------------------------------------------- 
 163 #---------------------------------------------------------------------- 
 165 class TestPanel(wxPanel
): 
 166     def __init__(self
, parent
, log
): 
 167         wxPanel
.__init
__(self
, parent
, -1) 
 169         self
.SetAutoLayout(true
) 
 170         outsideSizer 
= wxBoxSizer(wxVERTICAL
) 
 172         msg 
= "Clipboard / Drag-And-Drop" 
 173         text 
= wxStaticText(self
, -1, "", style
=wxALIGN_CENTRE
) 
 174         text
.SetFont(wxFont(24, wxSWISS
, wxNORMAL
, wxBOLD
, false
)) 
 176         w
,h 
= text
.GetTextExtent(msg
) 
 177         text
.SetSize(wxSize(w
,h
+1)) 
 178         text
.SetForegroundColour(wxBLUE
) 
 179         outsideSizer
.Add(text
, 0, wxEXPAND|wxALL
, 5) 
 180         outsideSizer
.Add(wxStaticLine(self
, -1), 0, wxEXPAND
) 
 182         inSizer 
= wxBoxSizer(wxHORIZONTAL
) 
 183         inSizer
.Add(ClipTextPanel(self
, log
), 1, wxEXPAND
) 
 184         inSizer
.Add(FileDropPanel(self
, log
), 1, wxEXPAND
) 
 186         outsideSizer
.Add(inSizer
, 1, wxEXPAND
) 
 187         self
.SetSizer(outsideSizer
) 
 190 #---------------------------------------------------------------------- 
 192 def runTest(frame
, nb
, log
): 
 193     win 
= TestPanel(nb
, log
) 
 196 #---------------------------------------------------------------------- 
 210 This demo shows some examples of data transfer through clipboard or drag and drop. In wxWindows, these two ways to transfer data (either between different applications or inside one and the same) are very similar which allows to implement both of them using almost the same code - or, in other words, if you implement drag and drop support for your application, you get clipboard support for free and vice versa. 
 212 At the heart of both clipboard and drag and drop operations lies the wxDataObject class. The objects of this class (or, to be precise, classes derived from it) represent the data which is being carried by the mouse during drag and drop operation or copied to or pasted from the clipboard. wxDataObject is a "smart" piece of data because it knows which formats it supports (see GetFormatCount and GetAllFormats) and knows how to render itself in any of them (see GetDataHere). It can also receive its value from the outside in a format it supports if it implements the SetData method. Please see the documentation of this class for more details. 
 214 Both clipboard and drag and drop operations have two sides: the source and target, the data provider and the data receiver. These which may be in the same application and even the same window when, for example, you drag some text from one position to another in a word processor. Let us describe what each of them should do.