wxPython - Glisser-déposer

Provision de drag and dropest très intuitif pour l'utilisateur. Il se trouve dans de nombreuses applications de bureau où l'utilisateur peut copier ou déplacer des objets d'une fenêtre à une autre simplement en les faisant glisser avec la souris et en les déposant sur une autre fenêtre.

L'opération glisser-déposer implique les étapes suivantes -

  • Déclarer une cible de dépôt
  • Créer un objet de données
  • Créer wx.DropSource
  • Exécuter l'opération de glissement
  • Annuler ou accepter le dépôt

Dans wxPython, il existe deux cibles de dépôt prédéfinies -

  • wx.TextDropTarget
  • wx.FileDropTarget

De nombreux widgets wxPython prennent en charge l'activité glisser-déposer. Le contrôle source doit avoir le glissement activé, tandis que le contrôle cible doit être en mesure d'accepter (ou de rejeter) le glissement.

Les données source que l'utilisateur fait glisser sont placées sur l'objet cible. OnDropText () de l'objet cible consomme les données. Si vous le souhaitez, les données de l'objet source peuvent être supprimées.

Exemple

Dans l'exemple suivant, deux objets ListCrl sont placés horizontalement dans un Box Sizer. La liste sur la gauche est remplie avec des données de langues []. Il est désigné comme la source de la traînée. L'un sur la droite est la cible.

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)

Le deuxième contrôle de liste est vide et est un argument pour l'objet de la classe 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)

La méthode OnDropText () ajoute des données source dans le contrôle de liste cible.

L'opération de glissement est initialisée par le classeur d'événements.

wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)

La fonction OnDragInit () place les données de glissement sur la cible et les supprime de la source.

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())

Le code complet est le suivant -

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()

Le code ci-dessus produit la sortie suivante -