简单的GUI Windows拖放

时间:2012-01-20 15:06:12

标签: python windows user-interface drag-and-drop

我想创建一个简单的GUI,提供可以拖放到其他Windows应用程序中的按钮,以便其他应用程序根据所选按钮接收某个字符串。

允许这种拖放的Python最简单的GUI框架是什么?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

理论上,您可以使用任何存在图形拖放设计器的库。这些工具通常生成库解析的标记语言,有时它们直接生成代码。后者是语言依赖的,而前者不应该。无论哪种方式,你都会找到一种用Python做的方法。

实际上,有些图书馆拥有比其他图书馆更好的视觉设计工具。当我使用它时,WinForms设计师非常优雅和无缝,所以也许IronPython? PyGTK,Glade还是前面提到的PyQt怎么样?也许Jython使用在NetBeans中设计的Swing?

编辑:哎呀,我没有正确地阅读这个问题。您正在寻找的是具有拖放功能的框架,即大多数。有很多事情需要考虑,例如目标和源窗口是否来自同一个进程?他们会用相同的框架编写吗?这些事情可能是相关的,也可能不是,取决于它是如何写的。

答案 2 :(得分:1)

任何UI库都可能以某种方式支持此功能。在wxPython中,我们允许列表项在各种列表之间移动。事情可能如下:

class JobList(VirtualList):
  def __init__(self, parent, colref = 'job_columns'):
    VirtualList.__init__(self, parent, colref)

  def _bind(self):
    VirtualList._bind(self)
    self.Bind(wx.EVT_LIST_BEGIN_DRAG, self._startDrag)

  def _startDrag(self, evt):
    # Create a data object to pass around.
    data = wx.CustomDataObject('JobIdList')
    data.SetData(str([self.data[idx]['Id'] for idx in self.selected]))

    # Create the dropSource and begin the drag-and-drop.
    dropSource = wx.DropSource(self)
    dropSource.SetData(data)
    dropSource.DoDragDrop(flags = wx.Drag_DefaultMove)

然后,有一个ListDrop类可以帮助将事物放到列表中:

class ListDrop(wx.PyDropTarget):
  """
    Utility class - Required to support List Drag & Drop.
    Using example code from http://wiki.wxpython.org/ListControls.
  """
  def __init__(self, setFn, dataType, acceptFiles = False):
    wx.PyDropTarget.__init__(self)

    self.setFn = setFn

    # Data type to accept.
    self.data = wx.CustomDataObject(dataType)

    self.comp = wx.DataObjectComposite()
    self.comp.Add(self.data)

    if acceptFiles:
      self.data2 = wx.FileDataObject()
      self.comp.Add(self.data2)

    self.SetDataObject(self.comp)

  def OnData(self, x, y, d):
    if self.GetData():
      if self.comp.GetReceivedFormat().GetType() == wx.DF_FILENAME:
        self.setFn(x, y, self.data2.GetFilenames())
      else:
        self.setFn(x, y, self.data.GetData())

    return d

最后,列出可以删除内容的列表:

class QueueList(VirtualList):
  def __init__(self, parent, colref = 'queue_columns'):
    VirtualList.__init__(self, parent, colref)

    self.SetDropTarget(ListDrop(self.onJobDrop, 'JobIdList', True))

  def onJobDrop(self, x, y, data):
    idx, flags = self.HitTest((x, y)) #@UnusedVariable

    if idx == -1: # Not dropped on a list item in the target list.
      return 

    # Code here to handle incoming data.