zoukankan      html  css  js  c++  java
  • 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()
    
    上面的代码产生下面的输出 -
  • 相关阅读:
    About chrysanthemum and matrimony vine
    time stamp in javascript
    Feeling kind of the sorrow
    从零开始入门 K8s | Kubernetes API 编程利器:Operator 和 Operator Framework
    从零开始入门 K8s | Kubernetes API 编程范式
    Apache Flink 1.10.0 发布 | 云原生生态周报 Vol. 38
    回顾 | Kubernetes SIG-Cloud-Provider-Alibaba 首次网研会(含 PPT 下载)
    开发函数计算的正确姿势——运行 Selenium Java
    Serverless 解惑——函数计算如何访问 Mongo 数据库
    开发函数计算的正确姿势——使用 brotli 压缩大文件
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/6138984.html
Copyright © 2011-2022 走看看