wxPython拖放
拖放對用戶是非常直觀。它在許多桌面應用程序,用戶可以複製或只需用鼠標拖動和刪除另一個窗口中移動對象從一個窗口到另一箇中。
拖放操作包括以下步驟 -
聲明拖放目標
創建數據對象
創建 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 - www.yiibai.com')
ex.MainLoop()
上面的代碼產生下面的輸出 -