Tkinter 将几个小部件拖放到一起?

Tkinter 将几个小部件拖放到一起?,tkinter,menu,drag-and-drop,widget,frame,Tkinter,Menu,Drag And Drop,Widget,Frame,我需要将几个小部件添加到一起,然后将它们拖放到一起。我的第一个想法是将所有小部件放在一个框架中,然后拖放框架。但存在一个问题,即框架位于小部件下,无法选择。来自tkinter import* from tkinter import * WIDTH, HEIGTH = 300, 300 root = Tk() def do_popup(event): try: m.tk_popup(event.x_root, event.y_root) finall

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

来自tkinter import*
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>", lambda event, 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()
宽度,高度=300300 root=Tk() def do_弹出窗口(事件): 尝试: m、 tk_弹出窗口(event.x_root,event.y_root) 最后: m、 抓斗释放() 几何体(“{}x{}.”格式(宽度、高度)) f1=帧(根) def使_可拖动(小部件): 对于小部件中的小部件: widget.bind(“,lambda事件,arg=widgets:on\u drag\u start(事件,arg)) widget.bind(“,在拖动运动时) widget.bind(“,lambda事件,arg=widgets:disable_bind(事件,arg)) 拖动启动时的def(事件、小部件): widget=event.widget widget=f1 widget.\u拖动\u开始\u x=event.x widget.\u拖动\u开始\u y=event.y #对于小部件中的小部件: #widget.bind(“,不可禁用的绑定(widgets)) 拖动运动时的def(事件): widget=event.widget widget=f1 x=widget.winfo\u x()-widget.\u拖动\u开始\u x+事件.x y=widget.winfo\u y()-widget.\u拖动\u开始\u y+事件.y widget.place(x=x,y=y) def disable_bind(事件、小部件): 打印('disable_bind') 对于小部件中的小部件: widget.unbind(“”) widget.unbind(“”) widget.unbind(“”) m=菜单(根,tearoff=0) m、 添加命令(label=“拖放”,command=lambda:make_draggable([b1,l1])) m、 添加命令(label=“Copy”) m、 添加命令(label=“粘贴”) m、 添加命令(label=“Reload”) m、 添加分隔符() m、 添加命令(label=“Rename”) l1=入口(f1) b1=列表框(f1) b1.绑定(“,do_弹出窗口) #b1.地点(边界模式=外部) b1.网格(行=0,列=0) l1.网格(行=1,列=0) f1.网格(行=0,列=0) #使可拖动(f1) root.mainloop()
这应该是答案吗?它似乎对我不起作用。通过对代码的注释或文本对您的答案进行解释总是很好的