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()
รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ -