如何创建拖放界面? [复制]

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。我什至不知道有没有它的功能。 我不小心否决了您的问题,除非您对答案进行编辑,否则无法更改我的投票。如果您删除有关这可能是欺骗的评论,我会改变我的投票。 我删除了关于副本的东西

以上是关于如何创建拖放界面? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 QTreeWidget 在拖放时创建重复项

如何使拖放始终在Flex 4 Spark List中复制(永不删除)?

如何使拖放列表进行复制而不是移动列表项

Python拖放编程

如何创建动态拖放模板?

如何在动态创建的 HTML 中使用拖放功能? (SortableJS)