鍍金池/ 教程/ Python/ wxPython拖放
wxPython GUI構(gòu)建工具wxFormBuilder
wxPython StaticText類
WxPython教程
wxPython可??看翱?/span>
wxPython ComboBox & Choice類
wxPython FlexiGridSizer布局
wxPython入門(Hello World)
wxPython RadioButton & RadioBox類
wxPython拖放
wxPython HTMLWindow類
wxPython ToolBar類
wxPython GridBagSizer布局
wxPython Dialog類
wxPython布局管理
wxPython TextCtrl類
wxPython開發(fā)環(huán)境安裝
wxPython Slider類
wxPython CheckBox類
wxPython Major類
wxPython GridSizer布局
wxPython事件處理
wxPython SplitterWindow類
Menu Item, Menu & MenuBar類
wxPython Button控件
wxPython StaticBoxSizer布局
wxPython Guage類
wxPython Frame類
wxPython多文檔界面
wxPython Panel類
wxPython BoxSizer布局
wxPython繪圖API

wxPython拖放

拖放對用戶是非常直觀。它在許多桌面應(yīng)用程序,用戶可以復(fù)制或只需用鼠標(biāo)拖動和刪除另一個窗口中移動對象從一個窗口到另一個中。
拖放操作包括以下步驟 -
  • 聲明拖放目標(biāo)
  • 創(chuàng)建數(shù)據(jù)對象
  • 創(chuàng)建 wx.DropSource
  • 執(zhí)行拖放操作
  • 取消或接受拖放
在wxPython中,有兩個預(yù)定義拖放目標(biāo) -
  • wx.TextDropTarget
  • wx.FileDropTarget
許多wxPython的小部件支持拖放活動。源代碼控制必須啟用拖動,而目標(biāo)控制必須在一個位置接受(或拒絕)拖放。
用戶拖動源數(shù)據(jù)放置在目標(biāo)對象上。目標(biāo)對象的OnDropText()會消耗數(shù)據(jù)。如果需要的話,從源對象的數(shù)據(jù)可以被刪除。

實(shí)例

在下面的例子中,兩個ListCrl對象在Box Sizer水平放置。在左邊列表填充了一個 languages[] 的數(shù)據(jù)。它被指定為拖動源。在右邊是目標(biāo)。
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類對象的參數(shù)。
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()方法添加源數(shù)據(jù)在目標(biāo)列表控件。
拖拽操作是由事件綁定器初始化。
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
OnDragInit()函數(shù)將在目標(biāo)上拖拽數(shù)據(jù)并從源中刪除。
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()
上面的代碼產(chǎn)生下面的輸出 -