Why I am unable to close the A Tkinter frame and create another one?
11:27 04 Mar 2026

I made this tkinter app:

import os
import tkinter as tk
from tkinter import ttk

class SelectBodyScreen(ttk.Frame):

    def __init__(self,root, lang, prod_text,test_text, on_next):
        super().__init__(root)

        self.lang = lang
        self.prod_text_content = prod_text
        self.test_text_content = test_text
        self.root = root

        self.build_ui()
        self.on_next = on_next

    def next_clicked(self):
        selected_body = self.final_text.get("1.0", tk.END).strip()
        self.on_next(selected_body)

    def use_prod(self):
        text = self.prod_text.get("1.0", tk.END)
        self.final_text.delete("1.0", tk.END)
        self.final_text.insert(tk.END, text)

    def use_test(self):
        text = self.test_text.get("1.0", tk.END)
        self.final_text.delete("1.0", tk.END)
        self.final_text.insert(tk.END, text)

    def build_ui(self):
        self.lang_label = ttk.Label(self.root, text="", font=("Arial", 14, "bold"))
        self.lang_label.pack(pady=10)

        frame = ttk.Frame(self.root)
        frame.pack(fill="both", expand=True)

        # PROD
        ttk.Label(frame, text="Prod Body").grid(row=0, column=0)
        self.prod_text = tk.Text(frame, height=15, width=50)
        self.prod_text.grid(row=1, column=0, padx=5)
        self.prod_text.insert("1.0",self.prod_text_content)

        # TEST
        ttk.Label(frame, text="Test Body").grid(row=0, column=1)
        self.test_text = tk.Text(frame, height=15, width=50)
        self.test_text.grid(row=1, column=1, padx=5)
        self.test_text.insert("1.0",self.test_text_content)

        # FINAL
        ttk.Label(frame, text="Final Body").grid(row=2, column=0, columnspan=2)
        self.final_text = tk.Text(frame, height=15, width=105)
        self.final_text.grid(row=3, column=0, columnspan=2, pady=5)

        button_frame = ttk.Frame(frame)
        button_frame.grid(row=4, column=0, columnspan=2, pady=10)

        ttk.Button(button_frame, text="Use Prod",
                   command=self.use_prod).pack(side="left", padx=5)

        ttk.Button(button_frame, text="Use Test",
                   command=self.use_test).pack(side="left", padx=5)

        ttk.Button(button_frame, text="Next",
                   command=self.next_clicked).pack(side="right", padx=5)



class TemplateWizard:

    def __init__(self, root, folder, template_name_without_env, lang_order, aggregate):

        self.root = root
        self.folder = folder
        self.template_name_without_env = template_name_without_env
        self.lang_order = lang_order
        self.aggregate = aggregate

        self.lang_index = 0
        self.current_screen = None

        self.root.title("Template Wizard")
        self.root.geometry("1100x800")

        self.final = {
            "body":{
                "el":"",
                "en":""
            },
            "buttons":[]
        }

        self.show_next_language()

    def show_next_language(self):

        if self.lang_index >= len(self.lang_order):
            print("Wizard finished")
            print("Final selections:", self.aggregate.get("final", {}))
            self.root.destroy()
            return

        lang = self.lang_order[self.lang_index]

        prod_text = self.aggregate[f"prod_{self.template_name_without_env}"][lang]['body']
        test_text = self.aggregate[f"test_{self.template_name_without_env}"][lang]['body'] 

        self.current_screen = SelectBodyScreen(
            root=self.root,
            lang=lang,
            prod_text=prod_text,
            test_text=test_text,
            on_next=self.on_screen_next
        )

        self.current_screen.pack(fill="both", expand=True)
    
    def on_screen_next(self, selected_body):

        lang = self.lang_order[self.lang_index]
        
        self.final['body'][lang]=selected_body

        print(selected_body)

        # # Store selected body
        # if "final" not in self.aggregate:
        #     self.aggregate["final"] = {}

        # self.aggregate["final"][lang] = selected_body

        self.lang_index += 1
        self.current_screen.destroy()

        self.show_next_language()

I am implementing a wizard that allows me to select a value from aggregate.

My issue is when I click next Button I get this:

a tkinter frame places bellow another one whithour properly closing

Annd frame is not destroyed properly. How I can fix this?

python tkinter