wxPython官方文档中文翻译 - 拖放概述

89 阅读2分钟

官方文档:docs.wxpython.org/dnd_overvie…

值得注意的是,与剪贴板之间的数据传输和通过拖放进行的数据传输非常相似,并且实现这两种数据传输的代码几乎是一样的。特别是,这两种数据传输机制都将数据存储在某种wx.DataObject中,并使用wx.DataFormat类来识别其数据格式。

要成为一个拖放源,也就是说要提供可供用户拖动到其他地方的数据,你应该执行以下步骤:

  • 准备:首先,必须创建一个数据对象,并使用你想要拖动的数据对其进行初始化。例如:
my_data = wx.TextDataObject("This text will be dragged.")
  • 开始拖动:要启动拖动过程(通常是对鼠标点击的响应),你必须像这样调用wx.DropSource.DoDragDrop
dragSource = wx.DropSource(self)
dragSource.SetData(my_data)
result = dragSource.DoDragDrop(True)
  • 拖动:对DoDragDrop() 的调用会阻塞程序,直到用户释放鼠标按钮(除非你重写wx.DropSource.GiveFeedback函数来执行一些特殊操作)。当鼠标在一个理解相同拖放协议的程序窗口中移动时(Windows下的任何程序,或者X Window下任何支持XDnD协议的程序),相应的wx.DropTarget方法就会被调用——详情见下文。
  • 处理结果DoDragDrop() 会返回一个效果代码,它是wx.DragResult的值之一:
if result == wx.DragCopy:
    # 复制数据
    CopyMyData()

elif result == wx.DragMove:
    # 移动数据
    MoveMyData()

else:
    # 默认情况下什么都不做
    pass

要成为一个拖放目标,也就是要接收用户拖放过来的数据,你应该按照以下说明进行操作:

  • 初始化:对于一个要成为拖放目标的窗口而言,它需要有一个关联的wx.DropTarget对象。通常,你需要在创建窗口时调用wx.Window.SetDropTarget方法,将你的拖放目标与该窗口关联起来。你必须从 wx.DropTarget派生一个类,并覆盖其中的纯虚方法。或者,你也可以从wx.TextDropTargetwx.FileDropTarget派生类,然后覆盖它们的OnDropText()OnDropFiles() 方法。
  • 放下:当用户在某个窗口上释放鼠标时,wxPython会询问与之关联的wx.DropTarget对象是否接受该数据。为此,必须将一个wx.DataObject与该拖放目标相关联,并且这个数据对象将负责在拖放源和拖放目标之间进行格式协商。如果一切顺利,那么wx.DropTarget.OnData将会被调用,并且属于该拖放目标的 wx.DataObject可以被填入数据。
  • 结束:在处理完数据后,DoDragDrop() 会根据放下数据时Ctrl、Shift和Alt键的状态,返回wx.DragCopy或wx.DragMove。目前,拖放目标无法更改此返回码。