2012-01-20 3 views
2

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

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

+1

С кем вы работали и что вы пробовали? wxPython имеет полную поддержку событий Drag & Drop, в дополнение к другим, упомянутым в ответах. –

+0

Я только что сделал TkInter. Полагаю, мне нужно все-таки научиться этому заново. Поэтому мне нужно очень простое, где у меня есть возможность найти онлайн-примеры, которые показывают, как сделать виджеты перетаскиваемыми и предоставить некоторый текст при перетаскивании. Мне нужен только список кнопок, которые обеспечивают перетаскиваемый текст. – Gerenuk

ответ

1

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

Выглядит многообещающе. Является ли это внутри-wxPython или будет работать с другими приложениями Windows Потому что все, что мне действительно нужно, это перетаскиваемый ярлык, который будет вставлять строку в приложения Windows при ее удалении. Поэтому я не беспокоюсь о том, чтобы быть отброшенным, и мне не нужны сложные объекты, просто какое-то строковое содержимое ... – Gerenuk

+0

@ Gerenuk - CustomDataObject был лучшим выбором на моем, но вы можете использовать 'wx.TextDataObject' или' wx.PyTextDataObject'. Вы можете найти более подробную информацию здесь: http://wiki.wxpython.org/ListControls#Drag_and_Drop_with_lists –

1
+0

Я вижу :) Тем не менее, я не мог найти и пример, чтобы выполнить перетаскивание (а не падение) и предоставить определенный текст. Не могли бы вы помочь мне найти ссылку? Я не знаю эту структуру :(.... EDIT: А его на следующей странице :) Надеюсь, это поможет ... – Gerenuk

+1

Вау, PyQt кажется сложным :(Я не вижу простого способа сделать перетаскивание: ( – Gerenuk

+0

Это так просто, как это получается. –

1

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

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

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

+0

Это разные процессы. В основном я хочу, чтобы текстовые строки были удалены в произвольное приложение Windows. Большинство из них поддерживают это. – Gerenuk