wxPython - Seret & Jatuhkan

Penyediaan drag and dropsangat intuitif bagi pengguna. Ini ditemukan di banyak aplikasi desktop di mana pengguna dapat menyalin atau memindahkan objek dari satu jendela ke jendela lain hanya dengan menyeretnya dengan mouse dan meletakkannya di jendela lain.

Operasi seret dan lepas melibatkan langkah-langkah berikut -

  • Nyatakan target penurunan
  • Buat objek data
  • Buat wx.DropSource
  • Jalankan operasi seret
  • Batalkan atau terima drop

Di wxPython, ada dua target penurunan yang telah ditentukan -

  • wx.TextDropTarget
  • wx.FileDropTarget

Banyak widget wxPython mendukung aktivitas seret dan lepas. Kontrol sumber harus mengaktifkan seret, sedangkan kontrol target harus dalam posisi untuk menerima (atau menolak) seret.

Sumber Data yang diseret pengguna ditempatkan pada objek target. OnDropText () dari objek target menggunakan data. Jika diinginkan, data dari objek sumber dapat dihapus.

Contoh

Dalam contoh berikut, dua objek ListCrl ditempatkan secara horizontal di Box Sizer. Daftar di sebelah kiri diisi dengan data bahasa []. Ini ditetapkan sebagai sumber hambatan. Satu di kanan adalah target.

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)

Kontrol daftar kedua kosong dan merupakan argumen untuk objek kelas 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)

Metode OnDropText () menambahkan data sumber dalam kontrol daftar target.

Operasi drag diinisialisasi oleh event binder.

wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)

Fungsi OnDragInit () menempatkan data tarik pada target dan menghapus dari sumbernya.

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

Kode lengkapnya adalah sebagai berikut -

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

Kode di atas menghasilkan keluaran sebagai berikut -