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

위의 코드는 다음 출력을 생성합니다.