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

时间:2017-07-11 19:07:41

标签: python tkinter

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

例如,如果用户首先单击“英语”按钮,则可以看到“展开”按钮。如果用户单击“展开”按钮,则可以看到“数据”按钮。之后,如果用户单击“土耳其语”按钮,“展开”按钮将变为“Genişlet”,但“数据“按钮仍然显示,最后如果用户点击”Genişlet“按钮,”数据“按钮变为”Veri“< / b>

但上述操作不是我想做的。我想通过点击“英语”“土耳其语”来更改“Veri”“数据”按钮按钮。

那么,为了做到这一点,我应该修改哪些代码?提前谢谢。

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

1 个答案:

答案 0 :(得分:1)

以下是一个示例,该示例保留您当前使用textvariablestringVar()

应用语言更改时所具有的功能

我确信有一种更好的方法,但对于这个简单的程序,这应该足够了。

我创建了两个设置为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()