wx.TreeCtrl 拖放、复制与移动

3 投票
1 回答
2923 浏览
提问于 2025-04-16 04:38

我正在尝试在 wx.TreeCtrl 上实现拖放功能,并且需要处理“复制”和“移动”这两种操作(如果用户按住 CTRL 键的话)。
首先,我在 wiki 上搜索了一个例子,但我对该使用哪个方法感到困惑……我应该使用 DropSource/DropTarget 还是仅仅处理 EVT_TREE_BEGIN_DRAG 和 EVT_TREE_END_DRAG?
如果是后者,我该如何判断用户是在请求“移动”操作呢?

(在 Ubuntu Jaunty 上使用 wxPython 2.8.9.1)

1 个回答

3

我从《使用wxWidgets进行跨平台GUI编程》的相关段落中获得了必要的见解,解决了这个问题 :)
最后我选择了第一个解决方案(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)

撰写回答