wxPython 拖放
提供 拖放 非常直观易用。在许多桌面应用程序中,用户可以通过拖动鼠标并将其放在另一个窗口上,从而在窗口之间复制或移动对象。
拖放操作包括以下步骤:
- 声明一个拖放目标
 - 创建数据对象
 - 创建wx.DropSource
 - 执行拖放操作
 - 取消或接受拖放
 
在wxPython中,有两个预定义的拖放目标:
- wx.TextDropTarget
 - wx.FileDropTarget
 
许多wxPython小部件支持拖放操作。源控件必须启用拖放功能,而目标控件必须能够接受(或拒绝)拖放。
用户拖动的源数据被放置在目标对象上。目标对象的OnDropText()方法消耗数据。如果需要,源对象的数据可以被删除。
示例
在以下示例中,两个ListCtrl对象水平放置在一个Box Sizer中。左侧的列表填充了一个languages[]的数据,它被指定为拖放的源。右侧是目标对象。
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#'] 
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST) 
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST) 
   for lang in languages: 
      self.lst1.InsertStringItem(0,lang)
第二个列表控件是空的,并且是TextDropTarget类对象的参数。
class MyTextDropTarget(wx.TextDropTarget):
   def __init__(self, object): 
      wx.TextDropTarget.__init__(self) 
      self.object = object
   def OnDropText(self, x, y, data): 
      self.object.InsertStringItem(0, data)
OnDropText()方法将源数据添加到目标列表控件中。
拖放操作由事件绑定器初始化。
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
OnDragInit()函数将拖动数据放置在目标上并从源中删除。
def OnDragInit(self, event): 
   text = self.lst1.GetItemText(event.GetIndex()) 
   tobj = wx.PyTextDataObject(text) 
   src = wx.DropSource(self.lst1) 
   src.SetData(tobj) 
   src.DoDragDrop(True) 
   self.lst1.DeleteItem(event.GetIndex())
完整的代码如下−
import wx
class MyTarget(wx.TextDropTarget): 
   def __init__(self, object): 
      wx.TextDropTarget.__init__(self) 
      self.object = object  
   def OnDropText(self, x, y, data): 
      self.object.InsertStringItem(0, data)  
class Mywin(wx.Frame): 
   def __init__(self, parent, title): 
      super(Mywin, self).__init__(parent, title = title,size = (-1,300))   
      panel = wx.Panel(self) 
      box = wx.BoxSizer(wx.HORIZONTAL)  
      languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript',
         'PHP', 'VB.NET','C#']
      self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST) 
      self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST) 
      for lang in languages: 
      self.lst1.InsertStringItem(0,lang) 
      dt = MyTarget(self.lst2) 
      self.lst2.SetDropTarget(dt) 
      wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
      box.Add(self.lst1,0,wx.EXPAND) 
      box.Add(self.lst2, 1, wx.EXPAND) 
      panel.SetSizer(box) 
      panel.Fit() 
      self.Centre() 
      self.Show(True)  
   def OnDragInit(self, event): 
      text = self.lst1.GetItemText(event.GetIndex()) 
      tobj = wx.PyTextDataObject(text) 
      src = wx.DropSource(self.lst1) 
      src.SetData(tobj) 
      src.DoDragDrop(True) 
      self.lst1.DeleteItem(event.GetIndex()) 
ex = wx.App() 
Mywin(None,'Drag&Drop Demo') 
ex.MainLoop()
上面的代码产生以下输出 –

极客教程