TclError: can't invoke "destroy" command: application has been destroyed
Question: I am a python beginner. Try to make a new button to close the window. I got
the error message:

> Exception in Tkinter callback Traceback (most recent call last): File
> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-
> tk/Tkinter.py", line 1536, in **call** return self.func(*args) File
> "tk_cp_successful.py", line 138, in buttonPushed self.root.destroy() File
> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-
> tk/Tkinter.py", line 1859, in destroy self.tk.call('destroy', self._w)
> TclError: can't invoke "destroy" command: application has been destroyed
    
    
    class LoginPage(tk.Frame):
       def __init__(self, parent, controller):
          self.controller = controller
          self.root = tk.Tk()
          global entry_1
          global entry_2
          tk.Frame.__init__(self, parent)
          label = tk.Label(self, text="Welcome to VISA Login Page",fg="blue")
          label.pack(pady=10,padx=10)
    
          label_1 = Label(self, text="Username")
          label_1.pack()
          label_2 = Label(self, text="Password")
          label_2.pack()
          entry_1 = Entry(self)
          entry_1.pack()
          entry_2 = Entry(self, show="*")
          entry_2.pack()
          label_1.grid(row=0, sticky=E)
          label_1.pack()
          label_2.grid(row=1, sticky=E)
          label_2.pack()
          entry_1.grid(row=0, column=1)
          entry_1.pack()
          entry_2.grid(row=1, column=1)
          entry_2.pack()
          checkbox = Checkbutton(self, text="Keep me logged in")
    
          checkbox.grid(columnspan=2)
          checkbox.pack()
          logbtn = Button(self, text="Login", command = self._login_btn_clickked)
          logbtn.grid(columnspan=2)
          logbtn.pack()
          myButton = Button(self, text="Exit",command = self.buttonPushed)
          myButton.pack()
    
      def buttonPushed(self):
          self.root.destroy()
    
      def _login_btn_clickked(self):
          #print("Clicked")
          username = entry_1.get()
          password = entry_2.get()
    
          #print(username, password)
    
          if username == "test" and password == "test":
              #box.showinfo("Login info", "Welcome Tester")
              button1 = ttk.Button(self, text="Please click, Welcome to login!!!",
                         command=lambda: self.controller.show_frame(StartPage))
              button1.pack()
          else:
              box.showerror("Login failed", "Incorrect username")
    


Answer: There are many problems with your code

  1. Indentation errors
  2. Mixing `grid()` and `pack()`
  3. Do you `import tkinter as tk` or `from tkinter import *`, i.e.  
`self.root = tk.Tk()` (`import as tk`) or  
`label_1 = Label(self, text="Username")` (`from tkinter import *`)

  4. No `mainloop` in program
  5. Use of global in a class is not necessary and poor style

In any case, the following modified code runs so hopefully it will help.

    
    
    import sys
    if sys.version_info[0] < 3:
        import Tkinter as tk     ## Python 2.x
    else:
        import tkinter as tk     ## Python 3.x
    
    class LoginPage():
       def __init__(self):
          self.root=tk.Tk()
          label = tk.Label(self.root, text="Welcome to VISA Login Page",fg="blue")
          label.grid(row=0)
    
          label_1 = tk.Label(self.root, text="Username")
          label_2 = tk.Label(self.root, text="Password")
          self.entry_1 = tk.Entry(self.root)
          self.entry_2 = tk.Entry(self.root, show="*")
          label_1.grid(row=1, sticky="e")
          label_2.grid(row=2, sticky="e")
          self.entry_1.grid(row=1, column=1)
          self.entry_2.grid(row=2, column=1)
    
          ## doesn't do anything at this time
          ##checkbox = tk.Checkbutton(self.root, text="Keep me logged in")
          ##checkbox.grid(row=3, columnspan=2)
    
          logbtn = tk.Button(self.root, text="Login", command = self._login_btn_clickked)
          logbtn.grid(row=9, columnspan=2)
          myButton = tk.Button(self.root, text="Exit",command = self.buttonPushed)
          myButton.grid(row=10)
    
          self.root.mainloop()
    
       def buttonPushed(self):
          self.root.destroy()
    
       def _login_btn_clickked(self):
          #print("Clicked")
          username = self.entry_1.get()
          password = self.entry_2.get()
    
          #print(username, password)
    
          if username == "test" and password == "test":
              print "OK login"
              #box.showinfo("Login info", "Welcome Tester")
              #button1 = ttk.Button(self.root, text="Please click, Welcome to login!!!",
              #           command=lambda: self.controller.show_frame(StartPage))
              #button1.pack()
          else:
              #box.showerror("Login failed", "Incorrect username")
              print "Error"
    
    LP=LoginPage()
    

