wxPython - Arrastar e Soltar
Fornecimento de drag and dropé muito intuitivo para o usuário. É encontrado em muitos aplicativos de desktop onde o usuário pode copiar ou mover objetos de uma janela para outra apenas arrastando-o com o mouse e soltando em outra janela.
A operação de arrastar e soltar envolve as seguintes etapas -
- Declarar um alvo de queda
- Criar objeto de dados
- Crie wx.DropSource
- Executar operação de arrastar
- Cancelar ou aceitar descartar
Em wxPython, existem dois destinos de soltar predefinidos -
- wx.TextDropTarget
- wx.FileDropTarget
Muitos widgets wxPython suportam atividade de arrastar e soltar. O controle de origem deve ter o arrasto ativado, enquanto o controle de destino deve estar em uma posição para aceitar (ou rejeitar) o arrasto.
Os dados de origem que o usuário está arrastando são colocados no objeto de destino. OnDropText () do objeto de destino consome os dados. Se desejar, os dados do objeto de origem podem ser excluídos.
Exemplo
No exemplo a seguir, dois objetos ListCrl são colocados horizontalmente em um Box Sizer. A lista à esquerda é preenchida com dados de idiomas []. É designado como fonte de arrasto. Um à direita é o alvo.
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)
O segundo controle de lista está vazio e é um argumento para objeto da 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)
O método OnDropText () adiciona dados de origem no controle de lista de destino.
A operação de arrastar é inicializada pelo fichário de eventos.
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
A função OnDragInit () coloca os dados de arrastar no destino e exclui da fonte.
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())
O código completo é o seguinte -
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()
O código acima produz a seguinte saída -