'Python Tkinter - Unable to obtain entry value after widgets in window are destroyed

I'm writing a program using Tkinter that prompts the user to enter their name as a value, then displays it after the contents of the window are cleared. However, I'm unable to retrieve this value. I'd like to know how I could fix this.

Below is my code:

import tkinter

class Window:
    def __init__(self):
        
        self.main_window = tkinter.Tk()

        self.main_window.title("Window Title")

        self.main_window.geometry("300x100")


        self.frame = tkinter.Frame(self.main_window)

        self.label1 = tkinter.Label(self.frame,
                                    text="Enter name:")
        self.label1.pack(pady=5)

        self.name_entry = tkinter.Entry(self.frame,
                                        width=20)
        self.name_entry.pack(pady=5)

        self.name = tkinter.StringVar()

        self.name_label = tkinter.Label(self.frame,
                                        textvariable=self.name)

        def frame2():
            for widget in self.frame.winfo_children():
                widget.destroy()
            self.frame.pack_forget()
            self.frame2.pack(pady=20) 

        self.name_enter = tkinter.Button(self.frame,
                                        text="Confirm",
                                        command=lambda:
                                        [self.getname(),frame2()])

        self.name_enter.pack(pady=5)

        self.frame.pack()

        self.frame2 = tkinter.Frame(self.main_window)

        self.label2 = tkinter.Label(self.frame2,
                                    text="Your name is " +
                                    str(self.name.get()) +
                                    ".")
        self.label2.pack(pady=5)

        tkinter.mainloop()

    def getname(self):
        nameget = str(self.name_entry.get())
        self.name.set(nameget)


if __name__ == '__main__':
    window = Window()


Solution 1:[1]

Using the suggestion from jasonharper I edit the code for a possible fix. I added another label above your label that takes in the StringVar() and then changed the label parameters to textvariable=self.name which gets the input.

import tkinter

class Window:
    def __init__(self):
        
        self.main_window = tkinter.Tk()

        self.main_window.title("Window Title")

        self.main_window.geometry("300x100")


        self.frame = tkinter.Frame(self.main_window)

        self.label1 = tkinter.Label(self.frame,
                                    text="Enter name:")
        self.label1.pack(pady=5)

        self.name_entry = tkinter.Entry(self.frame,
                                        width=20)
        self.name_entry.pack(pady=5)

        self.name = tkinter.StringVar()

        self.name_label = tkinter.Label(self.frame,
                                        textvariable=self.name)

        def frame2():
            for widget in self.frame.winfo_children():
                widget.destroy()
            self.frame.pack_forget()
            self.frame2.pack(pady=20) 

        self.name_enter = tkinter.Button(self.frame,
                                        text="Confirm",
                                        command=lambda:
                                        [self.getname(),frame2()])

        self.name_enter.pack(pady=5)

        self.frame.pack()

        self.frame2 = tkinter.Frame(self.main_window)

        self.labelx = tkinter.Label(self.frame2, text="Your name is")
        self.labelx.pack()

        self.label2 = tkinter.Label(self.frame2, textvariable=self.name)
        self.label2.pack(pady=5)

        tkinter.mainloop()

    def getname(self):
        nameget = str(self.name_entry.get())
        self.name.set(nameget)


if __name__ == '__main__':
    window = Window()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Rory