You forgot to use parent
in widgets ie. Label(self, ...)
so automatically you put widgets into root
(Main Window), not into self
(Frame). And later you remove widgets from self
but elements in root
stays.
from tkinter import *
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.init_window()
def init_window(self):
self.master.title("SAMPLE")
self.pack(expand=1)
l = Button(self, text="Log in", command=self.login)
l.grid(row=1)
def remove_all(self):
for widget in self.winfo_children():
widget.destroy()
def login(self):
self.remove_all()
self.var = StringVar()
self.L = {}
l = Label(self, text="Enter your code:")
l.grid(row=1, column=0)
e = Entry(self, textvariable=self.var)
e.grid(row=1, column=1)
b = Button(self, text="Ok", command=self.fun)
b.grid(row=1, column=2)
def fun(self):
self.remove_all()
self.L["Code"] = self.var.get()
l = Label(self, text="Code: " + self.L["Code"])
l.grid(row=1, column=0)
root = Tk()
root.geometry("700x700")
app = Window(root)
root.mainloop()
You can use another Frame
to group widgets and remove this Frame
with all widgets inside
from tkinter import *
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.init_window()
def init_window(self):
self.master.title("SAMPLE")
self.pack(expand=1)
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
l = Button(self.f, text="Log in", command=self.login)
l.grid(row=1)
def login(self):
# remove old `f`
self.f.destroy()
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
self.var = StringVar()
self.L = {}
l = Label(self.f, text="Enter your code:")
l.grid(row=1, column=0)
e = Entry(self.f, textvariable=self.var)
e.grid(row=1, column=1)
b = Button(self.f, text="Ok", command=self.fun)
b.grid(row=1, column=2)
def fun(self):
# remove old `f`
self.f.destroy()
# create empty `f`
self.f = Frame(self)
self.f.pack(expand=1)
self.L["Code"] = self.var.get()
l = Label(self.f, text="Code: " + self.L["Code"])
l.grid(row=1, column=0)
root = Tk()
root.geometry("700x700")
app = Window(root)
root.mainloop()