Простой графический интерфейс Windows Drag & Drop

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

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

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

PyQt на помощь.

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

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

EDIT: Упс, я не правильно прочитал вопрос. То, что вы ищете, – это инфраструктура с возможностями перетаскивания, то есть большинство из них. Есть много вещей, которые следует учитывать, например, как это происходит из того же процесса, что и конечные и исходные окна? Будут ли они написаны с той же структурой? Эти вещи могут быть релевантными или нет, в зависимости от того, как все написано.