import wx class DragController(wx.Control): """ Just a little control to handle dragging the text from a text control. We use a separate control so as to not interfere with the native drag-select functionality of the native text control. """ def __init__(self, parent, source, size=(25,25)): wx.Control.__init__(self, parent, -1, size=size, style=wx.SIMPLE_BORDER) self.source = source self.SetMinSize(size) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) def OnPaint(self, evt): # draw a simple arrow dc = wx.BufferedPaintDC(self) dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() w, h = dc.GetSize() y = h/2 dc.SetPen(wx.Pen("dark blue", 2)) dc.DrawLine(w/8, y, w-w/8, y) dc.DrawLine(w-w/8, y, w/2, h/4) dc.DrawLine(w-w/8, y, w/2, 3*h/4) def OnLeftDown(self, evt): text = self.source.GetValue() data = wx.TextDataObject(text) dropSource = wx.DropSource(self) dropSource.SetData(data) result = dropSource.DoDragDrop(wx.Drag_AllowMove) # if the user wants to move the data then we should delete it # from the source if result == wx.DragMove: self.source.SetValue("") class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Drop Source") p = wx.Panel(self) # create the controls label1 = wx.StaticText(p, -1, "Put some text in this control:") label2 = wx.StaticText(p, -1, "Then drag from the neighboring bitmap and\n" "drop in an application that accepts dropped\n" "text, such as MS Word.") text = wx.TextCtrl(p, -1, "Some text") dragctl = DragController(p, text) # setup the layout with sizers sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(label1, 0, wx.ALL, 5) hrow = wx.BoxSizer(wx.HORIZONTAL) hrow.Add(text, 1, wx.RIGHT, 5) hrow.Add(dragctl, 0) sizer.Add(hrow, 0, wx.EXPAND|wx.ALL, 5) sizer.Add(label2, 0, wx.ALL, 5) p.SetSizer(sizer) sizer.Fit(self) app = wx.PySimpleApp() frm = MyFrame() frm.Show() app.MainLoop()