小部件存在于层次结构中,并且每个小部件都将通过其父级在视觉上剪切.由于您希望窗口小部件在不同的时间出现在不同的框架中,因此它根本不能成为任何一个框架的子代.相反,使其成为框架父级的子代.然后,您可以通过使用in_参数使用place(或pack或grid)将小部件放置在任一框架中.
这是一个例子.它不使用拖放来保持代码紧凑,但是说明了原理.单击按钮将其从一帧移动到另一帧.
import tkinter as tk
class Example:
def __init__(self):
self.root = tk.Tk()
self.lf1 = tk.LabelFrame(self.root, text="Choose me!", width=200, height=200)
self.lf2 = tk.LabelFrame(self.root, text="No! Choose me!", width=200, height=200)
self.lf1.pack(side="left", fill="both", expand=True)
self.lf2.pack(side="right", fill="both", expand=True)
self.button = tk.Button(self.root, text="Click me", command=self.on_click)
self.button.place(in_=self.lf1, x=20, y=20)
def start(self):
self.root.mainloop()
def on_click(self):
current_frame = self.button.place_info().get("in")
new_frame = self.lf1 if current_frame == self.lf2 else self.lf2
self.button.place(in_=new_frame, x=20, y=20)
Example().start()