Python/Tkinter:如何将扩展帧的大小减小到它们的第一个位置?
根据以下代码;首次运行应用程序时,屏幕上会显示两个按钮。如果用户单击其中一个按钮,框架将展开,并且可以看到新按钮。如果用户单击新按钮,将展开另一个框架,并且可以再次看到新按钮 例如,如果用户第一次单击“英语”按钮,则可以看到“展开”按钮。如果用户单击“展开”按钮,则可以看到“数据”按钮。之后,如果用户单击“土耳其”按钮,“扩展”按钮变为“Genişlet”,但“数据”按钮仍保持显示,最后,如果用户单击“Genişlet”按钮,“数据”按钮变为“Veri” 但是上面的操作不是我想做的。我想通过单击“英语”或“土耳其语”按钮来更改“Veri”或“Data”按钮 那么,为了做到这一点,我应该修改代码的哪些部分?先谢谢你Python/Tkinter:如何将扩展帧的大小减小到它们的第一个位置?,python,tkinter,Python,Tkinter,根据以下代码;首次运行应用程序时,屏幕上会显示两个按钮。如果用户单击其中一个按钮,框架将展开,并且可以看到新按钮。如果用户单击新按钮,将展开另一个框架,并且可以再次看到新按钮 例如,如果用户第一次单击“英语”按钮,则可以看到“展开”按钮。如果用户单击“展开”按钮,则可以看到“数据”按钮。之后,如果用户单击“土耳其”按钮,“扩展”按钮变为“Genişlet”,但“数据”按钮仍保持显示,最后,如果用户单击“Genişlet”按钮,“数据”按钮变为“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()
下面是一个示例,它保留了您当前拥有的功能,同时能够使用
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:我已经对代码进行了更改,这样您就可以使用菜单选项重新启动/重置。如果愿意,还可以创建另一个链接到重置功能的按钮。为了做到这一点,我必须将创建的按钮放入一个框架中,然后在重置时销毁该框架。再次非常感谢,它也可以工作。我会检讨这些守则。