wxPython-드래그 앤 드롭
의 제공 drag and drop사용자에게 매우 직관적입니다. 사용자가 마우스로 끌어서 다른 창에 놓기 만하면 한 창에서 다른 창으로 개체를 복사하거나 이동할 수있는 많은 데스크톱 응용 프로그램에서 발견됩니다.
드래그 앤 드롭 작업에는 다음 단계가 포함됩니다.
- 놓기 대상 선언
- 데이터 개체 만들기
- wx.DropSource 만들기
- 드래그 작업 실행
- 드롭 취소 또는 수락
wxPython에는 두 개의 미리 정의 된 드롭 대상이 있습니다.
- wx.TextDropTarget
- wx.FileDropTarget
많은 wxPython 위젯은 드래그 앤 드롭 활동을 지원합니다. 소스 컨트롤에는 끌기가 활성화되어 있어야하지만 대상 컨트롤은 끌기를 허용 (또는 거부) 할 위치에 있어야합니다.
사용자가 드래그하는 소스 데이터는 대상 개체에 배치됩니다. 대상 개체의 OnDropText ()는 데이터를 사용합니다. 원하는 경우 소스 개체의 데이터를 삭제할 수 있습니다.
예
다음 예제에서는 두 개의 ListCrl 개체가 Box Sizer에 가로로 배치됩니다. 왼쪽 목록은 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()
위의 코드는 다음 출력을 생성합니다.