一起拖放几个小部件?

问题描述

我需要将几个小部件一起添加并拖放到一起。我在想的第一种方式是将所有小部件放在一个框架中,然后拖放该框架。但是存在一个问题,该框架位于小部件下方,无法选择。

解决方法

from tkinter import *
WIDTH,HEIGTH = 300,300







root = Tk()

def do_popup(event):
    try:
        m.tk_popup(event.x_root,event.y_root)
    finally:
        m.grab_release()

root.geometry('{}x{}'.format(WIDTH,HEIGTH))
f1=Frame(root)

def make_draggable(widgets):
    for widget in widgets:
        widget.bind("<Button-1>",lambda event,arg=widgets: on_drag_start(event,arg))
        widget.bind("<B1-Motion>",on_drag_motion)
        widget.bind("<ButtonRelease-1>",arg=widgets: disaable_bind(event,arg))

def on_drag_start(event,widgets):
    widget = event.widget
    widget = f1
    widget._drag_start_x = event.x
    widget._drag_start_y = event.y

    # for widget in widgets:
    #     widget.bind("<ButtonRelease-1>",disaable_bind(widgets))

def on_drag_motion(event):
    widget = event.widget
    widget = f1
    x = widget.winfo_x() - widget._drag_start_x + event.x
    y = widget.winfo_y() - widget._drag_start_y + event.y
    widget.place(x=x,y=y)

def disaable_bind(event,widgets):
    print('disaable_bind')
    for widget in widgets:
        widget.unbind("<Button-1>")
        widget.unbind("<B1-Motion>")
        widget.unbind("<ButtonRelease-1>")

m = Menu(root,tearoff=0)
m.add_command(label="drop and drag",command= lambda: make_draggable([b1,l1]))
m.add_command(label="Copy")
m.add_command(label="Paste")
m.add_command(label="Reload")
m.add_separator()
m.add_command(label="Rename")

l1 = Entry(f1)
b1 = Listbox(f1)
b1.bind("<Button-3>",do_popup)
# b1.place(bordermode=OUTSIDE)
b1.grid(row = 0,column = 0)
l1.grid(row = 1,column = 0)


f1.grid(row = 0,column = 0)
# make_draggable(f1)

root.mainloop()