Wxpython-drag-and-drop

提供:Dev Guides
移動先:案内検索

wxPython-ドラッグアンドドロップ

  • ドラッグ&ドロップ*の提供は、ユーザーにとって非常に直感的です。 ユーザーがオブジェクトをマウスでドラッグして別のウィンドウにドロップするだけで、あるウィンドウから別のウィンドウにオブジェクトをコピーまたは移動できる多くのデスクトップアプリケーションで見られます。

ドラッグアンドドロップ操作には、次の手順が含まれます-

  • ドロップターゲットを宣言する
  • データオブジェクトを作成する
  • wx.DropSourceを作成する
  • ドラッグ操作を実行
  • ドロップをキャンセルまたは受け入れる

wxPythonでは、2つの事前定義されたドロップターゲットがあります-

  • wx.TextDropTarget
  • wx.FileDropTarget

多くのwxPythonウィジェットは、ドラッグアンドドロップアクティビティをサポートしています。 ソースコントロールではドラッグを有効にする必要がありますが、ターゲットコントロールはドラッグを受け入れる(または拒否する)位置になければなりません。

ユーザーがドラッグしているソースデータは、ターゲットオブジェクトに配置されます。 ターゲットオブジェクトのOnDropText()はデータを消費します。 必要に応じて、ソースオブジェクトのデータを削除できます。

次の例では、2つのListCrlオブジェクトがBox Sizerに水平に配置されています。 左側のリストには、languages []データが入力されています。 ドラッグのソースとして指定されています。 右側の1つがターゲットです。

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()

上記のコードは、次の出力を生成します-

ドラッグドロップ出力