John Doe
John Doe

Reputation: 1

Why can't Tkinter open more than two windows?

I'm working on a program in Python using Tkinter.

The issue is that I have buttons that open other windows. My issue is that it can't open more than two windows.

Any ideas on how to fix this?

from tkinter import *

class first(object):
    def __init__(self, master):
        self.master = master
        self.admin_btn = Button(master, text = "First", command = self.second)
        self.admin_btn.grid(row = 0, column = 0)
        
    def second(self):
        self.w = second(self.master)
        self.master.wait_window(self.w.top)

class second(object):
    def __init__(self, master):
        top = self.top = Toplevel(master)
        self.second = Button(top, text = "Second", command = self.third)
        self.second.grid(row= 0, column = 0)

    def third(self):
        self.w = third(self.master)
        self.master.wait_window(self.w.top)

class third(object):
    def __init__(self, master):
        top = self.top = Toplevel(master)
        self.second = Button(top, text = "Third")
        self.second.grid(row= 0, column = 0)


if __name__ == "__main__":
    root = Tk()
    m = first(root)
    root.mainloop()

Upvotes: 0

Views: 557

Answers (3)

j_4321
j_4321

Reputation: 16179

I suggest that all your classes inherit from Toplevel instead of object, this way, all your classes will have a master attribute (which is why you had an error, the second class does not have one):

from tkinter import *

class First(Toplevel):
    def __init__(self, master):
        Toplevel.__init__(self, master)
        self.admin_btn = Button(self, text = "First", command = self.second)
        self.admin_btn.grid(row=0, column=0)

    def second(self):
        self.w = Second(self)
        self.wait_window(self.w)

class Second(Toplevel):
    def __init__(self, master):
        Toplevel.__init__(self, master)
        self.second = Button(self, text = "Second", command = self.third)
        self.second.grid(row=0, column=0)

    def third(self):
        self.w = Third(self.master)
        self.wait_window(self.w)

class Third(Toplevel):
    def __init__(self, master):
        Toplevel.__init__(self, master)
        self.second = Button(self, text = "Third")
        self.second.grid(row=0, column=0)


if __name__ == "__main__":
    root = Tk()
    m = First(root)
    m.lift(root)
    root.wait_window(m)
    root.mainloop()

Upvotes: 0

furas
furas

Reputation: 143187

You forgot in second window

self.master = master

and you get error message when you try to open third window.

But you should rather assign Toplevel(master) to self. master and then use self.master instead of self.top

from tkinter import *


class First(object):

    def __init__(self, master):
        self.master = master # = Tk()
        self.btn = Button(self.master, text="First", command=self.second)
        self.btn.grid(row=0, column=0)

    def second(self):
        self.w = Second(self.master)
        self.master.wait_window(self.w.master)


class Second(object):

    def __init__(self, master):
        self.master = Toplevel(master)
        self.btn = Button(self.master, text="Second", command=self.third)
        self.btn.grid(row=0, column=0)

    def third(self):
        self.w = Third(self.master)
        self.master.wait_window(self.w.master)


class Third(object):

    def __init__(self, master):
        self.master = Toplevel(master)
        self.btn = Button(self.master, text="Third")
        self.btn.grid(row=0, column=0)


if __name__ == "__main__":
    root = Tk()
    first = First(root)
    root.mainloop()

And now all classes looks very similar - they have self.master = Tk() or self.master = Toplevel(master)


BTW: use CamelCase names for classes - First, Second, Third - it helps recognize classes in code.

Upvotes: 1

Python241820
Python241820

Reputation: 1557

Try using this code:

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 = 'First', 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 = 'Second', 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()

In this code I have added two windows but you can add a third one.

Upvotes: 0

Related Questions