Простой графический интерфейс Windows Drag & Drop - PullRequest
2 голосов
/ 20 января 2012

Я хотел бы сделать простой графический интерфейс, который предлагает кнопки, которые я могу перетаскивать в другие приложения Windows, так что эти другие приложения получают определенную строку в зависимости от выбранной кнопки.

Что будетсамый простой графический интерфейс для Python, который позволяет это перетаскивание?

Ответы [ 3 ]

1 голос
/ 20 января 2012

Теоретически, вы можете использовать любую библиотеку, для которой существует графический дизайнер перетаскивания.Такие инструменты часто генерируют язык разметки, который разбирает библиотека, а иногда они генерируют код напрямую.Последнее зависит от языка, в то время как первое не должно быть.В любом случае, вы найдете способ сделать это с Python.

Практически, некоторые библиотеки имеют лучшие инструменты визуального проектирования, чем другие.Дизайнер WinForms был действительно элегантным и цельным, когда я его использовал, так что, может быть, IronPython?Как насчет PyGTK, с Glade или вышеупомянутым PyQt?Может, Jython использует Swing, разработанный в NetBeans?

РЕДАКТИРОВАТЬ: Ой, я не прочитал вопрос правильноТо, что вы ищете, - это фреймворк с возможностями перетаскивания, т. Е. Большинство из них.Однако есть много вещей, которые нужно учитывать, например, будут ли окна назначения и исходного кода происходить из одного и того же процесса?Будут ли они написаны с одинаковыми рамками?Эти вещи могут быть актуальны или нет, в зависимости от того, как все это написано.

1 голос
/ 20 января 2012

Любая из библиотек пользовательского интерфейса, вероятно, будет каким-то образом поддерживать это.В 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.
1 голос
/ 20 января 2012
...