Предоставление перетаскивания очень интуитивно понятно для пользователя. Он встречается во многих настольных приложениях, где пользователь может копировать или перемещать объекты из одного окна в другое, просто перетаскивая его мышью и перетаскивая в другое окно.
Операция перетаскивания включает в себя следующие шаги:
- Объявите цель отбрасывания
- Создать объект данных
- Создать wx.DropSource
- Выполнить операцию перетаскивания
- Отменить или принять сброс
В wxPython есть две предопределенные цели удаления —
- wx.TextDropTarget
- wx.FileDropTarget
Многие виджеты wxPython поддерживают перетаскивание. В исходном контроле должно быть включено перетаскивание, тогда как целевой элемент должен быть в состоянии принять (или отклонить) перетаскивание.
Исходные данные, которые пользователь перетаскивает, помещаются на целевой объект. OnDropText () целевого объекта потребляет данные. При желании данные из исходного объекта могут быть удалены.
пример
В следующем примере два объекта ListCrl размещаются горизонтально в Box Sizer. Список слева заполняется данными языков []. Это обозначено как источник сопротивления. Один справа является целью.
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()
Приведенный выше код производит следующий вывод —