问题描述
我需要将几个小部件一起添加并拖放到一起。我在想的第一种方式是将所有小部件放在一个框架中,然后拖放该框架。但是存在一个问题,该框架位于小部件下方,无法选择。
解决方法
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()