Python Forum
[Tkinter] Error when closing the main window with destroy
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tkinter] Error when closing the main window with destroy
#1
Exclamation 
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
Reply
#2
Post the entire error trace please.

Where is login finding self.root? There is no root in login to destroy.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Interaction between Matplotlib window, Python prompt and TKinter window NorbertMoussy 3 539 Mar-17-2024, 09:37 AM
Last Post: deanhystad
  tkinter destroy label inside labelFrame Nick_tkinter 3 4,573 Sep-17-2023, 03:38 PM
Last Post: munirashraf9821
  [PyQt] PyQt5 window closing when trying to display a graph bianca 4 1,740 Aug-12-2023, 03:25 PM
Last Post: bianca
  [PyQt] Can't get MDIarea to resize automatically with Main Window JayCee 4 3,498 Aug-02-2021, 08:47 PM
Last Post: JayCee
  [Tkinter] _tkinter.TclError: can't invoke "destroy" command: application has been destroyed knoxvilles_joker 6 15,668 Apr-25-2021, 08:41 PM
Last Post: knoxvilles_joker
  [PyQt] How to clip layout to sides and bottom of main window? Valmont 9 4,973 Mar-24-2021, 10:00 PM
Last Post: deanhystad
  Menu destroy Heyjoe 5 3,374 Mar-02-2021, 01:45 AM
Last Post: Heyjoe
  "tkinter.TclError: NULL main window" Rama02 1 5,879 Feb-04-2021, 06:45 PM
Last Post: deanhystad
Question closing a "nested" window with a button in PySimpleGUI and repeating this process Robby_PY 9 13,638 Jan-18-2021, 10:21 PM
Last Post: Serafim
  [PyQt] Received RunTimeError after script concludes, closing Dialog Window (clicking x-out) skipper0802 0 2,577 Oct-09-2020, 09:23 PM
Last Post: skipper0802

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020