本概述讨论了通过剪贴板或拖放操作进行的数据传输。 wxPython中,这两种传输数据的方式(无论是在不同应用程序之间,还是在同一个应用程序内部)非常相似,这使得几乎可以使用相同的代码来实现这两种方式。也就是说,如果你为你的应用程序实现了拖放支持,那么也就同时免费获得了剪贴板支持,反之亦然。
剪贴板操作和拖放操作的核心都是wx.DataObject类。这个类的对象(或者更确切地说,从它派生出来的类的对象)代表了在拖放操作期间由鼠标携带的数据,或者是从剪贴板复制或粘贴的数据。wx.DataObject是一种 “智能” 数据,因为它知道自己支持哪些数据格式(请参阅GetFormatCount和GetAllFormats方法),并且知道如何以其中任何一种格式呈现自身(请参阅GetDataHere方法)。如果它实现了SetData方法,它还能够以自身支持的格式从外部接收数据值。更多详细信息,请参阅这个类的文档说明。
剪贴板操作和拖放操作都存在两个方面:源端和目标端,也就是数据提供者和数据接收者。例如,当你在文字处理软件中把某些文本从一个位置拖到另一个位置时,源端和目标端可能处于同一个应用程序甚至是同一个窗口中。下面让我们来描述一下它们各自应该做些什么。
数据提供者(源端)的职责
数据提供者负责创建一个包含要传输数据的wx.DataObject对象。然后,它应该要么使用wx.Clipboard.SetData函数将该对象传递给剪贴板,要么将其传递给wx.DropSource并调用wx.DropSource.DoDragDrop函数。
一个小的区别在于,在进行剪贴板操作时,应用程序通常事先就知道它是在复制数据还是剪切数据(也就是复制并删除数据)—— 实际上,这通常取决于用户选择了哪个菜单项。但对于拖放操作而言,只有在wx.DropSource.DoDragDrop函数返回后(通过其返回值),应用程序才能知道这一点。
数据接收者(目标端)的职责
要从剪贴板接收(用常用术语来说就是粘贴)数据,你应该创建一个派生自wx.DataObject的类,该类要支持你所需的数据格式,然后将其作为参数传递给wx.Clipboard.GetData函数。如果该函数返回False,则表示不存在(任何一种)支持格式的数据。如果返回True,则表示数据已成功传输到wx.DataObject中。