Close main tkinter window with destroy() [error]

Hi, I have a problem. I’m trying to close the main window when logging in, with destroy(), but it throws me an error, why? what am I doing wrong? How can I solve it? Any additional information would be appreciated.
The error that I get when I press the button and want to close the window is the following:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/tkinter/__init__.py", line 1948, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "/Users/tomassanchezgarcia/Desktop/python-test/iniciar_sesion.py", line 84, in validar
self.root.destroy()
^^^^^^^^^

main.py

from tkinter import *
from tkinter import ttk
import tkinter as tk
import pymysql
from conexion import *
from tkinter import messagebox
from PIL import Image, ImageTk
from iniciar_sesion import Login

class AplicacionInventario:

    def __init__(self):
        self.root = Tk()
        self.root.title("StockMaster")
        self.root.geometry("400x500")
        #Bloquear agrandar ventana
        self.root.resizable(0,0)

        self.wtotal = self.root.winfo_screenwidth()
        self.htotal = self.root.winfo_screenheight()
        #  Guardamos el largo y alto de la ventana
        self.wventana = 400
        self.hventana = 500
        # #  Aplicamos la siguiente formula para calcular donde debería posicionarse
        self.pwidth = round(self.wtotal/2-self.wventana/2)
        self.pheight = round(self.htotal/2-self.hventana/2)
        #  Se lo aplicamos a la geometría de la ventana
        self.root.geometry(str(self.wventana)+"x"+str(self.hventana)+"+"+str(self.pwidth)+"+"+str(self.pheight))

        self.imagen = Image.open("src/logo.png")
        self.imagen = self.imagen.resize((350, 100))  # Opcional: Redimensionar la imagen
        self.imagen = ImageTk.PhotoImage(self.imagen)
        # Crear un widget Label con la imagen y colocarlo en la ventana
        self.label_imagen = tk.Label(self.root, image=self.imagen)
        self.label_imagen.pack(pady=20)

        self.login1 = Login(self)


        #fetch_data_button = tk.Button(self.root, text="Obtener Datos", command=self.mostrar2)
        #fetch_data_button.pack()
        

        self.root.mainloop()

AplicacionInventario()

iniciar_sesion.py

from tkinter import *
from tkinter import ttk
import tkinter as tk
import pymysql
from conexion import *
from tkinter import messagebox
from PIL import Image, ImageTk
from test2 import Menus

class Login:
    def __init__(self, app):
        self.app = app

        self.t_Email = "Email:"
        self.label_email = tk.Label(text=self.t_Email)
        self.label_email.pack(pady=5, padx=20)
        self.label_email.place(x=150, y=150, width=100, height=20)
        
        self.entry_email = tk.Entry()
        self.entry_email.pack(pady=5)
        self.entry_email.place(x=75, y=170, width=250, height=50)
        
        self.t_Password = "Contraseña:"
        self.label_password = tk.Label(text=self.t_Password)
        self.label_password.pack(pady=5, padx=20)
        self.label_password.place(x=150, y=220, width=100, height=20)
        
        self.entry_password = tk.Entry(show="*")
        self.entry_password.pack(pady=5)
        self.entry_password.place(x=75, y=240, width=250, height=50)
        
        self.login_email = self.entry_email.get()
        self.login_password = self.entry_password.get()
        
        self.boton_login = tk.Button(text="Iniciar Sesión", command=self.validar)
        self.boton_login.pack(pady=5)
        self.boton_login.place(x=125, y=300, width=150, height=50)

    def validar(self):
        #self.conexion_login = connect_to_database()
        #self.cursor_conexion_login = self.conexion_login.cursor()

        #self.cursor_conexion_login.execute("SELECT email, password FROM usuarios WHERE email=%s AND password=%s", (self.login_email, self.login_password))
        #self.verificar_login = self.cursor_conexion_login.fetchall()

        #messagebox.showwarning("Advertencia", self.verificar_login)

        # Conectarse a la base de datos utilizando la función importada
        self.connection2 = connect_to_database()
        self.cursor2 = self.connection2.cursor()
        # Ejemplo: Ejecutar una consulta para obtener datos
        self.cursor2.execute("SELECT nombre,password FROM usuarios")
        self.data2 = self.cursor2.fetchall()
        #messagebox.showwarning("Advertencia", self.data2)
        # Cerrar el cursor y la conexión
        for self.fila in self.data2:
            self.v_email = self.fila[0]
            self.v_password = self.fila[1]

        self.cursor2.close()
        self.connection2.close()
        if self.entry_email.get() == "" or self.entry_password.get() == "":
            self.dialogo = tk.Toplevel()
            self.dialogo.title("Diálogo Personalizado")
            self.dialogo.geometry("300x50")
            self.dialogo.resizable(0,0)

            self.wtotal2 = self.dialogo.winfo_screenwidth()
            self.htotal2 = self.dialogo.winfo_screenheight()
        
            self.wventana2 = 300
            self.hventana2 = 50
        
            self.pwidth2 = round(self.wtotal2/2-self.wventana2/2)
            self.pheight2 = round(self.htotal2/2-self.hventana2/2)
        
            self.dialogo.geometry(str(self.wventana2)+"x"+str(self.hventana2)+"+"+str(self.pwidth2)+"+"+str(self.pheight2))
            self.etiqueta = tk.Label(self.dialogo, text="Este es un cuadro de diálogo personalizado.", padx=10, pady=10)
            self.etiqueta.pack()
        elif self.entry_email.get() == self.v_email and self.entry_password.get() == self.v_password:
            #messagebox.showwarning("Advertencia", "PERFECTO COINCIDE")
            self.ventana_menu = Menus(self)
        else:
            self.root.destroy()
            messagebox.showwarning("Advertencia", "Los datos introducidos son incorrectos.")

how could i solve it? where am I wrong

What does the error say on the next line after that (the actual error message, not just the traceback)?

My guess is that the traceback ends wtih something like AttributeError: Login object 'self' has no attribute 'root'. I believe self.app.root.destroy() would work.