- wxPython教程
- wxPython - 主頁
- wxPython-簡介
- wxPython - 環境
- wxPython - Hello World
- wxPython - GUI生成工具
- wxPython - 主要類
- wxPython - 事件處理
- wxPython - 佈局管理
- wxPython - 按鈕
- wxPython - 可泊接視窗
- 多文件介面
- wxPython - 繪製API
- wxPython - 拖放
- wxPython資源
- wxPython - 快速指南
- wxPython - 有用資源
- wxPython - 討論
wxPython-拖放
提供拖放非常直觀。存在於許多桌面應用程式中,使用者可以透過將滑鼠拖動到另一個視窗然後進行拖放來從一個視窗複製或移動物件。
拖放操作涉及以下步驟:
- 宣告放置目標
- 建立資料物件
- 建立 wx.DropSource
- 執行拖放操作
- 取消或接受拖放
在 wxPython 中,有兩個預定義的放置目標:
- wx.TextDropTarget
- wx.FileDropTarget
很多 wxPython 小部件支援拖放活動。源控制元件必須啟用拖放功能,而目標控制元件必須處於可以接受(或拒絕)拖放的狀態。
使用者正在拖放的源資料被放置在目標物件上。目標物件上的 OnDropText() 會消耗資料。如果需要,可以刪除源物件中的資料。
示例
在以下示例中,兩個 ListCtrl 物件水平放置在 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')
ex.MainLoop()
上面的程式碼會生成以下輸出:
廣告