更新 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
我的 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