Python/Tkinter:如何将扩展帧的大小减小到它们的第一个位置?

Python/Tkinter:如何将扩展帧的大小减小到它们的第一个位置?,python,tkinter,Python,Tkinter,根据以下代码;首次运行应用程序时,屏幕上会显示两个按钮。如果用户单击其中一个按钮,框架将展开,并且可以看到新按钮。如果用户单击新按钮,将展开另一个框架,并且可以再次看到新按钮 例如,如果用户第一次单击“英语”按钮,则可以看到“展开”按钮。如果用户单击“展开”按钮,则可以看到“数据”按钮。之后,如果用户单击“土耳其”按钮,“扩展”按钮变为“Genişlet”,但“数据”按钮仍保持显示,最后,如果用户单击“Genişlet”按钮,“数据”按钮变为“Veri” 但是上面的操作不是我想做的。我想通过单击

根据以下代码;首次运行应用程序时,屏幕上会显示两个按钮。如果用户单击其中一个按钮,框架将展开,并且可以看到新按钮。如果用户单击新按钮,将展开另一个框架,并且可以再次看到新按钮

例如,如果用户第一次单击“英语”按钮,则可以看到“展开”按钮。如果用户单击“展开”按钮,则可以看到“数据”按钮。之后,如果用户单击“土耳其”按钮,“扩展”按钮变为“Genişlet”,但“数据”按钮仍保持显示,最后,如果用户单击“Genişlet”按钮,“数据”按钮变为“Veri”

但是上面的操作不是我想做的。我想通过单击“英语”或“土耳其语”按钮来更改“Veri”或“Data”按钮

那么,为了做到这一点,我应该修改代码的哪些部分?先谢谢你

import tkinter as tk


class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid(row=0, column=0, sticky="nsew")

        self.b1 = tk.Button(master=self, text="Turkish", width=20)
        self.b1.grid(row=0, column=0)
        self.b2 = tk.Button(master=self, text="English", width=20)
        self.b2.grid(row=0, column=1)

        self.f1 = tk.Frame(master=master)
        self.f1.grid(row=1, column=0)

        self.f2 = tk.Frame(master=master)
        self.f2.grid(row=2, column=0)

        self.f3 = tk.Frame(master=self.f1)
        self.f4 = tk.Frame(master=self.f1)

        self.b3 = tk.Button(master=self.f3, text="Genişlet")
        self.b3.grid(row=0, column=0)
        self.b4 = tk.Button(master=self.f4, text="Expand")
        self.b4.grid(row=0, column=0)

        self.f5 = tk.Frame(master=self.f2)
        self.f6 = tk.Frame(master=self.f2)

        self.b5 = tk.Button(master=self.f5, text="Veri")
        self.b5.grid(row=0, column=0)
        self.b6 = tk.Button(master=self.f6, text="Data")
        self.b6.grid(row=0, column=0)

        self.configure_buttons()

    @staticmethod
    def activate(frame, parent):
        for child in parent:
            child.grid_forget()
        frame.grid(row=0, column=0)

    def configure_buttons(self):
        self.b1.configure(command=lambda: self.activate(self.f3, self.f1.winfo_children()))
        self.b2.configure(command=lambda: self.activate(self.f4, self.f1.winfo_children()))
        self.b3.configure(command=lambda: self.activate(self.f5, self.f2.winfo_children()))
        self.b4.configure(command=lambda: self.activate(self.f6, self.f2.winfo_children()))


if __name__ == "__main__":
    root = tk.Tk()
    frame = App(master=root)
    frame.mainloop() 

下面是一个示例,它保留了您当前拥有的功能,同时能够使用
textvariable
stringVar()

我相信有更好的方法,但对于这个简单的程序来说,这应该足够了

我创建了两个变量,设置为
StringVar()
前两个按钮链接到一个函数/方法,该函数/方法将更改每个StringVar的字符串以反映语言选择

我还创建了一些占位符变量,直到需要创建其他按钮为止。让我知道你对这个选项的看法

更新:我添加了一个菜单,将删除除开始2个按钮以外的所有按钮。实际上是重启

import tkinter as tk


class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)

        self.master = master
        self.btn1_text = tk.StringVar()
        self.btn1_text.set("Expand")
        self.btn2_text = tk.StringVar()
        self.btn2_text.set("Data")
        self.second_frame = "None"
        self.btn2 = "None"
        self.master.columnconfigure(0, weight = 1)

        self.top_frame = tk.Frame(self.master)
        self.top_frame.grid(row = 0, column = 0, sticky = "ew")

        self.turkish_button = tk.Button(self.top_frame, text="Turkish", width=20, command = lambda: self.change_lang_and_add_btn1("turkish"))
        self.turkish_button.grid(row=0, column=0)
        self.english_button = tk.Button(self.top_frame, text="English", width=20, command = lambda: self.change_lang_and_add_btn1("english"))
        self.english_button.grid(row=0, column=1)

        self.menu = tk.Menu(self.master)
        self.master.config(menu = self.menu)
        self.file_menu = tk.Menu(self.menu, tearoff = 0)
        self.menu.add_cascade(label = "File", menu = self.file_menu)
        self.file_menu.add_command(label = "Reset", command = self.reset_buttons)

    def change_lang_and_add_btn1(self, choice):
        if choice == "english":
            self.btn1_text.set("Expand")
            self.btn2_text.set("Data")
        if choice == "turkish":
            self.btn1_text.set("Genişlet")
            self.btn2_text.set("Veri")

        if self.second_frame == "None":
            self.second_frame = tk.Frame(self.master)
            self.second_frame.grid(row = 1, column = 0, columnspan = 2)
            self.btn1 = tk.Button(self.second_frame, textvariable = self.btn1_text, width=20, command = lambda: self.add_btn2())
            self.btn1.grid(row = 1, column = 0, columnspan = 2)

    def add_btn2(self):
        if self.btn2 == "None":
            self.btn2 = tk.Button(self.second_frame, textvariable = self.btn2_text, width=20)
            self.btn2.grid(row = 2, column = 0, columnspan = 2)

    def reset_buttons(self):
        if self.second_frame != "None":
            self.second_frame.destroy()
            self.second_frame = "None"
            self.btn2 = "None"


if __name__ == "__main__":
    root = tk.Tk()
    frame = App(root)
    frame.mainloop()

您应该向语言按钮添加一个命令,该命令调用一个函数,该函数将更改按钮的文本变量,以在每种语言的预定义文本之间进行更改。应该很容易实现。好的,我会尽量做到。但是语言按钮已经有了命令,我们可以给它们第二个命令吗?使用一个函数来改变文本也会让你有更少的代码。它将减少按钮的数量,因为每个部分只需要一个按钮,只需更改该按钮上的文本:)我删除了按钮名称,然后添加了一个函数,将文本更改为“土耳其”和“英语”按钮。但它只是显示它的英文名称。好像它只显示第二个定义的变量。顺便说一句,我刚刚用您的建议解决了这个问题,再次感谢您。@dilde olupbiten:您想通过单击最后一个按钮来删除展开的按钮,还是想使用类似重置按钮的功能?还是重置菜单选项?太好了,它可以工作。我需要检查你的代码并用它们做练习。你的方法和我选择的不同。如果你想看,我会发布我的。哦,(如果你现在有空)是的,重置按钮是合适的。顺便说一下,非常感谢。@dildeolupbiten:我已经对代码进行了更改,这样您就可以使用菜单选项重新启动/重置。如果愿意,还可以创建另一个链接到重置功能的按钮。为了做到这一点,我必须将创建的按钮放入一个框架中,然后在重置时销毁该框架。再次非常感谢,它也可以工作。我会检讨这些守则。