Чтение соответствующего абзаца из Программирование кроссплатформенного графического интерфейса с помощью wxWidgets дало мне необходимую информацию для решения проблемы:)
В конце концов, я выбрал первое решение (DropSource / DropTarget),итак:
tree.SetDropTarget(MyDropTarget())
tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.on_drag)
tree.GetMainWindow().Bind(wx.EVT_MOUSE_CAPTURE_LOST, lambda x: None)
(при втором связывании избегается таинственное «окно, которое захватывало мышь, не обрабатывало wxEVT_MOUSE_CAPTURE_LOST» при перетаскивании)
def on_drag(self, evt):
# No evt.Allow() here, I won't use TreeCtrl's internal DND support
item = evt.GetItem()
if item == self.tree.GetRootItem():
return
dropsrc = wx.DropSource(self)
# Populate dropsource
# ...
dropsrc.DoDragDrop(wx.Drag_AllowMove)