如何使用tkinter在父母之外移动按钮?

时间:2017-11-14 16:32:15

标签: python python-3.x tkinter widget tk

我正在尝试使用tkinter拖放来移动按钮。 问题是,当我试图移动我的按钮时,它正在工作,但我不能将它移到他的父母之外: 我有一个LabelFrame,其中包含几个带按钮的LabelFrame。我正在尝试将一个按钮从LabelFrame拖放到另一个按钮,但是当按钮移出其父级时,它会“消失”。 我正在使用窗口小部件的方法“放置”来拖动它。

我不确定我的问题是否真的可以理解。如果不能更好地解释它,我会提供一些代码。

1 个答案:

答案 0 :(得分:4)

小部件存在于层次结构中,每个小部件都将由其父级进行可视化裁剪。由于您希望窗口小部件在不同的时间出现在不同的帧中,因此它不能是任何帧的子帧。相反,使它成为帧的父级的子级。然后,您可以使用place(或packgrid)将小部件放在任一帧中,方法是使用in_参数。

这是一个例子。它不使用拖放来保持代码紧凑,但它说明了原理。单击按钮将其从一帧移动到另一帧。

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()