I have a main class for my GUI, where i create a ttk.ProgressBar:
class MainApplication(tk.Tk): def __init__(self): super().__init__() #--FenĂȘtre principale self.title("MyApp") self.geometry('1000x500') self.notebook = ttk.Notebook(self) self.Page1 = Page1(self.notebook) self.Page2 = Page2(self.notebook) self.Page3 = Page3(self.notebook) self.Page4 = Page4(self.notebook) self.notebook.add(self.Page1, text='Page1') self.notebook.add(self.Page2, text='Page2') self.notebook.add(self.Page3, text='Page3') self.notebook.add(self.Page4, text='Page4') self.notebook.pack(fill=BOTH, expand=True) self.progress = ttk.Progressbar(self, orient=HORIZONTAL, length=490, mode='determinate') self.progress.pack()
I have a class for each page of my Notebook and i want update my progressbar when i run a function in my page2, I tried:
class Page2(ttk.Frame): def __init__(self, container): super().__init__() self.send = ttk.Button(self, text='SEND', command=send_message) self.Button_envoyer.place(relx=0.01, rely=0.8) def send_message(self): self.progress.start() self.progress['value'] = 0 self.update_idletasks() self.time.sleep(1) print("0%") self.progress['value'] = 50 self.update_idletasks() self.time.sleep(1) print("50%") self.progress['value'] = 100 self.update_idletasks() self.time.sleep(1) print("100%") self.progress.stop()
But I get the error message :
AttributeError: 'Page2' object has no attribute 'progress'
I simplified the code for be the most generalist possible.
How can I do that then?
Advertisement
Answer
You have progressbar
in MainApplication
so Page2
would need some access to MainApplication
.
Normally we send parent object as first argument in widgets i.e. Button(root,...)
and later widget can use self.master
to access parent object.
But you don’t assign parent object in super().__init__()
so it automatically set tk.Tk
as parent. And if you use self.master
then you should have access to MainApplication
self.master.progressbar.start() # etc.
Page2 | | .master V MainApplication
EDIT:
If you would assign Notebook
(container
) as master/parent for Page2
class Page2(ttk.Frame): def __init__(self, container): super().__init__(container) # <-- `container` as parent
then you would need
self.master.master.progressbar.start() # etc.
Page2 | | .master V Notebook | | .master V MainApplication