Aj James
Aj James

Reputation: 79

How to handle a main window button using closing event (Tkinter "X" button)?

Can anyone help me with this. Once I click the button, there will be a new window that pop up and the button will be disabled. How can I enable again the button from win1 after clicking the "X" button on win2?

This is my code:

from tkinter import *

class win1:
    def __init__(self, master):
        self.master = master
        self.master.geometry('200x100+0+0')

        self.btn1 = Button(self.master, text='Click', command=self.openwin)
        self.btn1.pack()
    
    def openwin(self):
        self.openwin2 = Toplevel(self.master)
        app = win2(self.openwin2)
        self.btn1['state'] = 'disabled'

class win2:
    def __init__(self, master):
        self.master = master
        self.master.geometry('200x100+100+100')

        self.btn1 = Label(self.master, text='Click the close button')
        self.btn1.pack()

        self.master.protocol("WM_DELETE_WINDOW", self.closewin)

    def closewin(self):
        self.master.btn1['state'] = 'normal'

def main():
    root = Tk()
    app = win1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Traceback:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\Python385\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "d:/PC Access/Documents/CPET8-8L/GUI/testing.py", line 27, in closewin
    self.master.btn1['state'] = 'normal'
AttributeError: 'Toplevel' object has no attribute 'btn1'

Upvotes: 0

Views: 171

Answers (1)

Matiiss
Matiiss

Reputation: 6176

here is how I would edit the code:

from tkinter import *

class win1:
    def __init__(self, master):
        self.master = master
        self.master.geometry('200x100+0+0')

        self.btn1 = Button(self.master, text='Click', command=self.openwin)
        self.btn1.pack()

    def openwin(self):
        self.openwin2 = Toplevel(self.master)
        app = win2(self.openwin2, self)
        self.btn1['state'] = 'disabled'

class win2:
    def __init__(self, master, main_window):
        self.master = master
        self.main_window = main_window
        self.master.geometry('200x100+100+100')

        self.btn1 = Label(self.master, text='Click the close button')
        self.btn1.pack()

        self.master.protocol("WM_DELETE_WINDOW", self.closewin)

    def closewin(self):
        self.main_window.btn1['state'] = 'normal'
        self.master.destroy()

def main():
    root = Tk()
    app = win1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

the parts I changed:

def closewin(self):
        self.main_window.btn1['state'] = 'normal'
        self.master.destroy()

and this:

class win2:
    def __init__(self, master, main_window):
        self.master = master
        self.main_window = main_window

and this:

def openwin(self):
        self.openwin2 = Toplevel(self.master)
        app = win2(self.openwin2, self)
        self.btn1['state'] = 'disabled'

also I would suggest using those classes differently but You do You (does not seem too bad)

Upvotes: 2

Related Questions