如何制作拖放界面?

时间:2017-07-03 14:02:48

标签: python tkinter drag-and-drop python-3.5

目前,我正在使用tkinter模块进行Python 3.5 GUI开发。我希望能够在应用程序中将图像从一个地方拖动到另一个地方。 tkinter是否支持在应用程序中拖放,如果是,您是如何做到的?

问题Drag and Drop in Tkinter?询问应用程序之间的拖放,这不是我在这里问的问题。

from tkinter import *

root = Tk()
root.geometry("640x480")

canvas = Canvas(root, height=480, width=640, bg="white")

frame = Frame(root, height=480, width=640, bg="white")
frame.propagate(0)

image = PhotoImage(file="C:/Users/Shivam/Pictures/Paint/Body.png")

label = Label(canvas, image=image)
label.pack()

label_2 = Label(frame, text="Drop Here !")
label_2.pack()
label_2.place(x=200, y=225, anchor=CENTER)

canvas.pack(side=LEFT)
frame.pack()

root.mainloop()

2 个答案:

答案 0 :(得分:4)

Tkinter对应用程序中的拖放没有任何直接支持。但是,拖放只需要为按钮单击(<ButtonPress-1>)进行合适的绑定,鼠标在单击按钮时移动(<B1-Motion>),以及释放按钮时({{ 1}})。

这是一个非常简单的示例,旨在使用您的代码。

首先,我们将创建一个可以管理拖放的类。作为一个类而不是一组全局函数,这样做更容易。

<ButtonRelease-1>

要使用它,您只需调用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 方法,为其提供您想要拖动的小部件。

例如:

add_draggable

这就是基本框架所需的全部内容。您可以创建一个浮动的可拖动窗口,也可以突出显示可以放置的项目。

其他实施

有关相同概念的其他实现,请参阅https://github.com/python/cpython/blob/master/Lib/tkinter/dnd.py

答案 1 :(得分:3)

https://github.com/akheron/cpython/blob/master/Lib/tkinter/dnd.py
我测试了它,它似乎仍然在python 3.6.1中工作,我建议尝试使用它并使它成为你自己的,因为它似乎没有在Tkinter中得到官方支持。