How can I create a Drag and Drop interface? [duplicate] How can I create a Drag and Drop interface? [duplicate] tkinter tkinter

How can I create a Drag and Drop interface? [duplicate]


Tkinter doesn't have any direct support for drag and drop within an application. However, drag and drop requires not much more than making suitable bindings for a button click (<ButtonPress-1>), the mouse moving while the button is clicked (<B1-Motion>), and when the button is released (<ButtonRelease-1>).

Here is a very simplestic example which is designed to work with your code.

First, we'll create a class that can manage the dragging and dropping. It's easier to do this as a class rather than a collection of global functions.

class DragManager():    def add_dragable(self, widget):        widget.bind("<ButtonPress-1>", self.on_start)        widget.bind("<B1-Motion>", self.on_drag)        widget.bind("<ButtonRelease-1>", self.on_drop)        widget.configure(cursor="hand1")    def on_start(self, event):        # you could use this method to create a floating window        # that represents what is being dragged.        pass    def on_drag(self, event):        # you could use this method to move a floating window that        # represents what you're dragging        pass    def on_drop(self, event):        # find the widget under the cursor        x,y = event.widget.winfo_pointerxy()        target = event.widget.winfo_containing(x,y)        try:            target.configure(image=event.widget.cget("image"))        except:            pass

To use it, all you need to do is call the add_draggable method, giving it the widget(s) you wish to drag.

For example:

label = Label(canvas, image=image)...dnd = DragManager()dnd.add_dragable(label)...root.mainloop()

That's all it takes for the basic framework. It's up to you to create a floating draggable window, and to perhaps highlight the item(s) that can be dropped on.

Other implementations

For another implementation of the same concept, see https://github.com/python/cpython/blob/master/Lib/tkinter/dnd.py


https://github.com/akheron/cpython/blob/master/Lib/tkinter/dnd.py
I tested it and it still seems to work in python 3.6.1, I suggest experimenting with it and making it your own, because it doesn't seem to be officially supported in Tkinter.