如何创建拖放界面? [复制]
Posted
技术标签:
【中文标题】如何创建拖放界面? [复制]【英文标题】:How can I create a Drag and Drop interface? [duplicate] 【发布时间】:2017-12-06 20:10:45 【问题描述】:目前,我正在使用 tkinter 模块进行 Python 3.5 GUI 开发。我希望能够在应用程序中将图像从一个地方拖到另一个地方。 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()
【问题讨论】:
你的意思是我应该写一个我想拖动的例子吗? 我不知道@Donal 期望您尝试写什么。 有一个实验性的 DND tkinter 模块。见this answer。另见文章Drag-n-drop for Python/Tkinter howto。 @martineau 谢谢! @martineau:如果您所做的只是在应用程序本身中拖放,则不需要实验模块。 @martineau:是的,它看起来绝对是那个人的骗子。然而,这绝对是一个与第一个被标记为重复的问题不同的问题。 【参考方案1】:Tkinter 对应用程序中的拖放没有任何直接支持。但是,拖放只需要为单击按钮 (<ButtonPress-1>
)、单击按钮时鼠标移动 (<B1-Motion>
) 以及释放按钮时 (<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
方法,将您想要拖动的小部件提供给它。
例如:
label = Label(canvas, image=image)
...
dnd = DragManager()
dnd.add_dragable(label)
...
root.mainloop()
这就是基本框架所需的全部内容。您可以创建一个浮动的可拖动窗口,并可能突出显示可以拖放的项目。
其他实现
有关相同概念的另一种实现,请参阅https://github.com/python/cpython/blob/master/Lib/tkinter/dnd.py
【讨论】:
非常感谢先生...这正是我所需要的!非常感谢您的帮助! @Bryan Oakley,如何获取我正在拖动的文件的路径? @UchihaMadara:我该如何回答?我不知道你的代码是什么样子的。 我打算创建一个编辑器来编写文本和拖放图像。我希望能够将图像拖入编辑器并使用Label
小部件将其放入编辑器中。但是Label
需要图像路径。所以我想在我进入编辑器时获取图像的路径,所以我可以将它传递给label
。 (还没写代码。)【参考方案2】:
https://github.com/akheron/cpython/blob/master/Lib/tkinter/dnd.py 我对其进行了测试,它似乎仍然可以在 python 3.6.1 中使用,我建议尝试使用它并制作你自己的,因为它似乎在 Tkinter 中不受官方支持。
【讨论】:
感谢您的快速回复!但它不是重复的!我说我使用 tkinter。我什至不知道有没有它的功能。 我不小心否决了您的问题,除非您对答案进行编辑,否则无法更改我的投票。如果您删除有关这可能是欺骗的评论,我会改变我的投票。 我删除了关于副本的东西以上是关于如何创建拖放界面? [复制]的主要内容,如果未能解决你的问题,请参考以下文章