【问题标题】:is there any possiblity to drag a label to another location in the same parent label in tkinter?是否有可能将标签拖到 tkinter 中同一父标签中的另一个位置?
【发布时间】:2021-09-21 18:45:17
【问题描述】:

我有一个带有许多子标签的标签,我希望它是可拖动的,以便用户可以将其拖动到父标签空间中他们想要的任何位置(大小 x y)。 长时间搜索,但我没有找到任何东西。我找到了 tkinterDnD,但是当我尝试 pip3 为 python3 安装 thinterDnD 时,它返回一个错误,即没有找到它的版本。 任何帮助表示赞赏

【问题讨论】:

  • 为什么你还有一个带有子小部件的标签?标签专门用于简单地显示文本或图像或两者,它们不是框架,也不应该像这样使用它们。你也可以尝试使用.place() 然后
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python-3.x tkinter


【解决方案1】:

您可以使用place 将标签放置在另一个标签内的特定坐标处。要支持拖动项目,您只需绑定按钮单击和按钮运动即可调整坐标。

这是一种方法。此示例使用标签作为容器,但您可以使用任何所需的小部件,因为 tkinter 允许任何小部件成为另一个小部件的父级。话虽如此,使用Label 对于其他小部件的容器来说是一个奇怪的选择。 Frame 会更有意义。

import tkinter as tk

class Draggable():
    def __init__(self, widget, x=0, y=0):
        self.start_x = 0
        self.start_y = 0
        widget.place(x=x, y=y)
        widget.bind("<ButtonPress-1>", self.drag_start)
        widget.bind("<B1-Motion>", self.drag)

    def drag_start(self, event):
        self.start_x = event.x
        self.start_y = event.y

    def drag(self, event):
        delta_x = event.x - self.start_x
        delta_y = event.y - self.start_y

        # move the widget to the new position
        x = event.widget.winfo_x() + delta_x
        y = event.widget.winfo_y() + delta_y
        event.widget.place(x=x, y=y)

root = tk.Tk()
root.geometry("400x400")
container = tk.Label(root, bd=2, relief="raised")
container.pack(side="top", fill="both", expand=True, padx=20, pady=20)

l1 = tk.Label(container, text="Label #1")
l2 = tk.Label(container, text="Label #2")

Draggable(l1, x=10, y=10)
Draggable(l2, x=10, y=30)

root.mainloop()

【讨论】:

  • 这个答案有帮助
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多