Как я могу перетащить несколько виджетов одновременно? Я могу перетаскивать свои метки, но хочу перетаскивать их одновременно - PullRequest
2 голосов
/ 30 мая 2020
from tkinter import *

def vp_start_gui():
    root = Tk()
    top = Toplevel1 (root)

root.mainloop()

class Toplevel1:
    def __init__(self, top=None):

        top.geometry("300x300")

Я использую все ваши функции, они отлично работают так же, как и вы, но если я скажу, что класс doesent работает хорошо

если я выбираю индивидуально, он прыгает примерно на половину экрана def select_and_drag ( widgets_list): "" "Перетаскивает вместе все виджеты в данном списке с помощью мыши.

            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, '+')

        self.Label1_3 = Label(top)
        self.Label1_3.place(relx=0.687, rely=0.183, height=36, width=124)
        self.Label1_3.configure(text='''Height''', bg="brown")

        self.Label1 = Label(top, text="try")
        self.Label1.pack()

        select_and_drag((self.Label1_3, self.Label1))
        select_and_drag((self.Label1,))

    if __name__ == '__main__':
    vp_start_gui()

1 Ответ

2 голосов
/ 30 мая 2020

Да, это возможно, и вы почти закончили со своим кодом. Я только что изменил и улучшил вашу функцию перетаскивания, я сделал одну функцию 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...