Skip to content
Advertisement

Update ttk.ProgressBar defined in other class Python

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
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement