Search code examples
pythonclasstkinterdestroy

Tkinter example code for multiple windows, why won't buttons load correctly?


I am writing a program which should:

  1. Open a window with the press of a button.
  2. Close the newly opened window with the press of another button.

I'm using classes so I can insert the code into a larger program later. However, I can't get my buttons to load correctly.

import tkinter as tk

class Demo1(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self)
        self.pack()
        self.master.title("Demo 1")
        self.button1 = tk.Button(self, text = "Button 1", width = 25,
                               command = self.new_window)
        self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S)

    def new_window(self):
        self.newWindow = Demo2()

class Demo2(tk.Frame):
    def __init__(self):
        new = tk.Frame.__init__(self)
        new = tk.Toplevel(self)
        new.title("Demo 2")
        new.button = tk.Button(text = "Button 2", width = 25,
                               command = self.close_window)
        new.button.pack()

    def close_window(self):
        self.destroy()

def main():
    Demo1().mainloop()

if __name__ == '__main__':
    main()

Solution

  • I rewrote your code in a more organized, better-practiced way:

    import tkinter as tk
    
    class Demo1:
        def __init__(self, master):
            self.master = master
            self.frame = tk.Frame(self.master)
            self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
            self.button1.pack()
            self.frame.pack()
    
        def new_window(self):
            self.newWindow = tk.Toplevel(self.master)
            self.app = Demo2(self.newWindow)
    
    class Demo2:
        def __init__(self, master):
            self.master = master
            self.frame = tk.Frame(self.master)
            self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
            self.quitButton.pack()
            self.frame.pack()
    
        def close_windows(self):
            self.master.destroy()
    
    def main(): 
        root = tk.Tk()
        app = Demo1(root)
        root.mainloop()
    
    if __name__ == '__main__':
        main()
    

    Result:

    Demo1 window Demo2 window