Да, это возможно, и вы почти закончили со своим кодом. Я только что изменил и улучшил вашу функцию перетаскивания, я сделал одну функцию select_and_drag(widget_list)
, которая берет список виджетов и объединяет их вместе, что означает, что перемещение одного виджета заставит все виджеты в этом наборе двигаться вперед.
Вот функция.
def select_and_drag(widgets_list):
"""Drags all the widgets together
in the given list with mouse point.
Args:
widgets_list (list, tuple): Takes list of widgets
to be moved together."""
def set_drag(evt):
"""Set iniitial points."""
for w in widgets_list:
w._drag_x = evt.x
w._drag_y = evt.y
def on_drag(evt):
"""Drags with mouse."""
for w in widgets_list:
x = w.winfo_x() - w._drag_x + evt.x
y = w.winfo_y() - w._drag_y + evt.y
w.place(x=x, y=y)
for wid in widgets_list:
wid.bind("<Button-1>", set_drag, '+')
wid.bind("<B1-Motion>", on_drag, '+')
Как им пользоваться?
Более одного набора могут быть созданы с помощью различных виджетов из этой функции. Вы можете получить представление из этого примера ниже, переместите каждый SET и убедитесь сами.
from tkinter import *
root = Tk()
root.geometry("600x350")
# SET 1
lbl1 = Label(root, text='SET1', fg='red')
lbl1.pack()
lbl2 = Label(root, text='SET1', fg='red')
lbl2.pack()
# Common for SET1 and SET3
lbl3 = Label(root, text='SET1 and SET3',
bg='pink', fg='red')
lbl3.pack()
# SET2
lbl4 = Label(root, text='SET2', bg='lightblue')
lbl4.pack()
lbl5 = Label(root, text='SET2', bg='lightblue')
lbl5.pack()
# SET2
lbl6 = Label(root, text='SET3', bg='pink')
lbl6.pack()
# Make SETS.
select_and_drag((lbl1, lbl2, lbl3))
select_and_drag((lbl4, lbl5))
select_and_drag((lbl3, lbl6))
root.mainloop()