wxPython - ลากและวาง

ข้อกำหนดของ drag and dropเป็นเรื่องง่ายมากสำหรับผู้ใช้ พบได้ในแอปพลิเคชันเดสก์ท็อปจำนวนมากที่ผู้ใช้สามารถคัดลอกหรือย้ายวัตถุจากหน้าต่างหนึ่งไปยังอีกหน้าต่างหนึ่งเพียงแค่ลากเมาส์แล้ววางลงบนหน้าต่างอื่น

การลากและวางเกี่ยวข้องกับขั้นตอนต่อไปนี้ -

  • ประกาศเป้าหมายการดรอป
  • สร้างวัตถุข้อมูล
  • สร้าง 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()

รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ -