【问题标题】:Simple GUI Windows Drag&Drop简单的 GUI 窗口拖放
【发布时间】:2012-01-20 15:06:12
【问题描述】:

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

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

【问题讨论】:

  • 你和谁合作过,你尝试过什么?除了答案中提到的其他事件之外,wxPython 还完全支持拖放事件。
  • 我只做了一些 TkInter。我想无论如何我都必须重新学习它。所以我需要一个非常简单的,我有机会找到在线示例,这些示例展示了如何使小部件可拖动并提供一些关于拖动的文本。我只需要提供可拖动文本的按钮列表。

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


【解决方案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.

【讨论】:

  • 看起来很有希望。那是 wxPython 内部还是可以与其他 Windows 应用程序一起使用?因为我真正需要的是一些可拖动的标签,它会在拖放到 Windows 应用程序时插入一个字符串。所以我不担心被丢弃,我不需要复杂的对象,只需要一些字符串内容......
  • @Gerenuk - CustomDataObject 是我的更好选择,但您也可以使用 wx.TextDataObjectwx.PyTextDataObject。您可以在这里找到更多信息:wiki.wxpython.org/ListControls#Drag_and_Drop_with_lists
【解决方案2】:

【讨论】:

  • 我明白了 :) 但是,我找不到执行拖放(而不是拖放)和提供定义文本的示例。你能帮我找到参考吗?我不知道这个框架 :( .... 编辑:啊它在下一页 :) 希望它有帮助...
  • 哇,PyQt 似乎很复杂 :( 我没有看到简单的拖动方法 :(
【解决方案3】:

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

实际上,一些库拥有比其他库更好的可视化设计工具。当我使用 WinForms 设计器时,它真的很优雅和无缝,所以也许 IronPython? PyGTK、Glade 或前面提到的 PyQt 怎么样?也许 Jython 使用在 NetBeans 中设计的 Swing?

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

【讨论】:

  • 这是不同的过程。基本上我想将文本字符串放入任意 Windows 应用程序中。他们中的大多数人都支持这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
相关资源
最近更新 更多