我有在 MS Windows 上运行的 wxPython 应用程序,我希望它支持其实例之间的拖放(因此用户打开我的应用程序 3 次并将数据从一个实例拖到另一个实例)。
wxPython 中的简单拖放就是这样工作的:
- 用户发起拖动:源窗口在 wx.DataObject() 中打包必要的数据,创建新的 wx.DropSource,设置其数据并调用 dropSource.DoDragDrop()
- 用户将数据拖放到目标窗口:拖放目标调用库函数 GetData(),它将实际数据传输到其 wx.DataObject 实例,最后 - dataObject.GetData() 解包实际数据。
我想要一些更复杂的拖放功能,允许用户选择在他下降后拖动哪些数据。我的梦想
场景:
- 用户发起拖拽:只有一些指向源窗口的指针被打包(一些函数或对象)。
- 用户将数据拖放到目标窗口:显示漂亮的对话框,询问用户他选择了哪种拖放模式(例如 - 仅拖动歌曲标题,或歌曲标题和艺术家姓名或拖动艺术家的整个专辑)。
- 用户选择拖拽模式:Drop target 在拖拽的数据对象上调用一些函数,然后从拖拽源中取出数据并传送到drop target。
我梦想的场景在 MS Windows 中似乎是可行的,但是 wxWidgets 和 wxPython 的文档非常复杂且模棱两可。并非所有 wx.DataObject 类都在 wxPython 中可用(仅 wx.PySimpleDataObject),所以我希望有人分享他对这种方法的经验。这样的行为是否可以在 wxPython 中实现而无需直接在 winAPI 中进行编码?
编辑:Toni Ruža 通过工作拖放示例给出了答案,但这并不是我梦寐以求的场景。他的代码在数据被拖放时操作数据(HandleDrop()显示弹出菜单),但数据在启动拖动时准备好(在On_ElementDrag()中)。在我的应用程序中应该有三种不同的拖放模式,其中一些需要耗时的数据准备。这就是为什么我想将数据检索推迟到用户丢弃数据并选择(可能成本高昂)d&d 模式的那一刻。
对于内存保护问题 - 我想使用 OLE 机制进行进程间通信,就像 MS Office 一样。您可以复制 Excel 图表并将其粘贴到 MS-Word 中,它的行为就像图像(嗯,有点)。由于它有效,我相信它可以在 winAPI 中完成。我只是不知道我是否可以在 wxPython 中对其进行编码。