更新 ttk.ProgressBar 在其他 class Python 中定义

Update ttk.ProgressBar defined in other class Python

我的 GUI 有一个主 class,我在其中创建了一个 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()

我的笔记本的每一页都有一个 class,我想在我的第 2 页 运行 一个函数时更新我的​​进度条,我试过:

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()

但我收到错误消息:

AttributeError: 'Page2' object has no attribute 'progress'

我简化了代码以成为最通才的人。

那我该怎么做呢?

您在 MainApplication 中有 progressbar,因此 Page2 需要访问 MainApplication

通常我们将父对象作为小部件中的第一个参数发送,即 Button(root,...) 之后小部件可以使用 self.master 来访问父对象。

但是您没有在 super().__init__() 中分配父对象,因此它会自动将 tk.Tk 设置为父对象。如果你使用 self.master 那么你应该可以访问 MainApplication

self.master.progressbar.start()

# etc.
Page2
  | 
  | .master
  V
MainApplication

编辑:

如果您将 Notebook (container) 分配为 master/parent for Page2

class Page2(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)  # <-- `container` as parent

那么你需要

self.master.master.progressbar.start()

# etc.
Page2
  | 
  | .master
  V
Notebook
  |
  | .master
  V
MainApplication