wx.TreeCtrl 拖放、复制与移动
我正在尝试在 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)