wxPython-ドラッグアンドドロップ
の提供 drag and dropユーザーにとって非常に直感的です。これは、ユーザーがオブジェクトをマウスでドラッグして別のウィンドウにドロップするだけで、あるウィンドウから別のウィンドウにオブジェクトをコピーまたは移動できる多くのデスクトップアプリケーションに見られます。
ドラッグアンドドロップ操作には、次の手順が含まれます-
- ドロップターゲットを宣言する
- データオブジェクトを作成する
- wx.DropSourceを作成します
- ドラッグ操作を実行する
- ドロップをキャンセルまたは受け入れる
wxPythonには、2つの事前定義されたドロップターゲットがあります-
- wx.TextDropTarget
- wx.FileDropTarget
多くのwxPythonウィジェットは、ドラッグアンドドロップアクティビティをサポートしています。ソース管理ではドラッグを有効にする必要がありますが、ターゲット管理はドラッグを受け入れる(または拒否する)位置にある必要があります。
ユーザーがドラッグしているソースデータは、ターゲットオブジェクトに配置されます。ターゲットオブジェクトのOnDropText()がデータを消費します。必要に応じて、ソースオブジェクトのデータを削除できます。
例
次の例では、2つのListCrlオブジェクトがBoxSizerに水平に配置されています。左側のリストには、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)
2番目のリストコントロールは空であり、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()
上記のコードは次の出力を生成します-