您可以使用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()