Reputation: 79
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
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