wxPython - Kéo & Thả
Cung cấp drag and droprất trực quan cho người dùng. Nó được tìm thấy trong nhiều ứng dụng máy tính để bàn, nơi người dùng có thể sao chép hoặc di chuyển các đối tượng từ cửa sổ này sang cửa sổ khác chỉ bằng cách kéo nó bằng chuột và thả trên cửa sổ khác.
Thao tác kéo và thả bao gồm các bước sau:
- Khai báo mục tiêu thả
- Tạo đối tượng dữ liệu
- Tạo wx.DropSource
- Thực hiện thao tác kéo
- Hủy bỏ hoặc chấp nhận thả
Trong wxPython, có hai mục tiêu thả được xác định trước -
- wx.TextDropTarget
- wx.FileDropTarget
Nhiều widget wxPython hỗ trợ hoạt động kéo và thả. Kiểm soát nguồn phải được kích hoạt kéo, trong khi kiểm soát mục tiêu phải ở vị trí chấp nhận (hoặc từ chối) kéo.
Dữ liệu nguồn mà người dùng đang kéo được đặt trên đối tượng đích. OnDropText () của đối tượng đích sử dụng dữ liệu. Nếu muốn, dữ liệu từ đối tượng nguồn có thể bị xóa.
Thí dụ
Trong ví dụ sau, hai đối tượng ListCrl được đặt theo chiều ngang trong Box Sizer. Danh sách bên trái chứa dữ liệu [] ngôn ngữ. Nó được coi là nguồn của lực cản. Một bên phải là mục tiêu.
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)
Điều khiển danh sách thứ hai trống và là một đối số cho đối tượng của lớp 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)
Phương thức OnDropText () thêm dữ liệu nguồn trong điều khiển danh sách đích.
Thao tác kéo được khởi tạo bởi chất kết dính sự kiện.
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
Hàm OnDragInit () đặt dữ liệu kéo vào mục tiêu và xóa khỏi nguồn.
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())
Mã hoàn chỉnh như sau:
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()
Đoạn mã trên tạo ra kết quả sau: