wxPython - Drag & Drop
Bereitstellung drag and dropist für den Benutzer sehr intuitiv. Es ist in vielen Desktop-Anwendungen zu finden, in denen der Benutzer Objekte von einem Fenster in ein anderes kopieren oder verschieben kann, indem er sie einfach mit der Maus zieht und in ein anderes Fenster legt.
Der Drag & Drop-Vorgang umfasst die folgenden Schritte:
- Deklarieren Sie ein Drop-Ziel
- Datenobjekt erstellen
- Erstellen Sie wx.DropSource
- Drag-Vorgang ausführen
- Abbrechen abbrechen oder akzeptieren
In wxPython gibt es zwei vordefinierte Drop-Ziele -
- wx.TextDropTarget
- wx.FileDropTarget
Viele wxPython-Widgets unterstützen Drag & Drop-Aktivitäten. Für die Quellcodeverwaltung muss das Ziehen aktiviert sein, während die Zielsteuerung in der Lage sein muss, das Ziehen zu akzeptieren (oder abzulehnen).
Quelldaten, die der Benutzer zieht, werden auf dem Zielobjekt platziert. OnDropText () des Zielobjekts verbraucht die Daten. Auf Wunsch können Daten aus dem Quellobjekt gelöscht werden.
Beispiel
Im folgenden Beispiel werden zwei ListCrl-Objekte horizontal in einem Box Sizer platziert. Die Liste auf der linken Seite enthält Sprachdaten []. Es wird als Quelle des Widerstands bezeichnet. Eine rechts ist das Ziel.
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)
Das zweite Listensteuerelement ist leer und ein Argument für das Objekt der TextDropTarget-Klasse.
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)
Die OnDropText () -Methode fügt dem Ziellistensteuerelement Quelldaten hinzu.
Der Ziehvorgang wird vom Ereignisordner initialisiert.
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
Die Funktion OnDragInit () legt Ziehdaten auf das Ziel und löscht sie aus der Quelle.
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())
Der vollständige Code lautet wie folgt:
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()
Der obige Code erzeugt die folgende Ausgabe -