wxPython - 拖放

为用户提供拖放非常直观.它存在于许多桌面应用程序中,用户只需用鼠标拖动对象并放在另一个窗口上就可以将对象从一个窗口复制或移动到另一个窗口.

拖放操作涉及到以下步骤 :

  • 声明放弃目标

  • 创建数据对象

  • 创建wx.DropSource

  • 执行拖动操作

  • 取消或接受放弃

在wxPython中,有两个预定义的放置目标 :

  • wx.TextDropTarget

  • wx.FileDropTarget

许多wxPython小部件支持拖放活动.源控件必须启用拖动,而目标控件必须处于接受(或拒绝)拖动的位置.

用户拖动的源数据放置在目标对象上.目标对象的OnDropText()使用数据.如果需要,可以删除源对象中的数据.

示例

在下面的示例中,两个ListCrl对象水平放置在一个Box中仪.左侧列表中填充了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()

上面的代码产生以下输出 :

拖放输出