Tkinter programming 2

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

Leave a Comment