[英]Python tkinter- object has no attribute
我正在嘗試更改按鈕的狀態,但出現屬性錯誤,這里是整個 traeback 的副本以供參考:
Traceback (most recent call last):
File "C:/Users/Test_Practice.py", line 53, in <module>
middle_buttons_class().Run_Button()
File "C:/Users/Test_Practice.py", line 14, in Run_Button
run_thread = threading.Thread(target=middle_buttons_class.Run_Robot_Files(self))
File "C:/Users/Test_Practice.py", line 23, in Run_Robot_Files
progress_bar().done_progress.config(state=tkinter.NORMAL)
AttributeError: 'progress_bar' object has no attribute 'done_progress'
我相信這可能是一個時髦的線程問題,但我不確定,有人可以幫我看看嗎?
class MiddleButtonsClass():
def run_button(self):
run_thread = threading.Thread(target=middle_buttons_class.Run_Robot_Files(self))
run_thread.daemon = True
run_thread.start()
def run_robot_files(self):
print("Tasks started")
progress_bar().progress_bar_thread()
progress_bar().done_progress.config(state=tkinter.NORMAL)
class ProgressBar():
def progress_bar_thread(self):
progress_bar_class = progress_bar()
progress_thread = threading.Thread(target=progress_bar_class.initialize_progress_bar())
progress_thread.daemon = True
progress_thread.start()
def initialize_progress_bar(self):
self.progress_window = tkinter.Toplevel()
self.progress_window.geometry("500x250")
self.progress_window.title("In Progress")
self.percentage_variable = tkinter.DoubleVar()
self.progressbar = tkinter.ttk.Progressbar(self.progress_window, style='text.Horizontal.TProgressbar',
variable=self.percentage_variable, maximum=500,
length=450, mode="determinate")
self.progressbar.pack(pady=100)
self.done_progress = tkinter.Button(self.progress_window, text="Done", state=tkinter.DISABLED,
command=None)
self.done_progress.pack()
if __name__ == "__main__":
master = tkinter.Tk()
master.title("Test Runner")
master.geometry("750x500")
middle_buttons_class().Run_Button()
master.mainloop()
所以你的問題是你試圖從progress_bar()
2 個單獨的實例進行編輯。 您應該做的是創建一個要使用的變量,然后從那里編輯類屬性。 我還將您的線程目標更改為使用 self 而不是嘗試創建另一個類實例。
這是您重新編寫的代碼以實際生成頂級窗口,我向按鈕添加了一個命令以向您顯示進度條的簡單更新。
也就是說你的代碼需要一些改進。
import tkinter
import threading
import tkinter.ttk as ttk
class middle_buttons_class():
def Run_Button(self):
run_thread = threading.Thread(target=self.Run_Robot_Files())
run_thread.daemon = True
run_thread.start()
def Run_Robot_Files(self):
print("Tasks started")
progress_bar_var = progress_bar()
progress_bar_var.progress_bar_thread()
progress_bar_var.done_progress.config(state=tkinter.NORMAL)
class progress_bar():
def progress_bar_thread(self):
progress_bar_class = self
progress_thread = threading.Thread(target=progress_bar_class.initialize_progress_bar())
progress_thread.daemon = True
progress_thread.start()
def initialize_progress_bar(self):
self.progress_window = tkinter.Toplevel()
self.progress_window.geometry("500x250")
self.progress_window.title("In Progress")
self.percentage_variable = tkinter.DoubleVar()
self.progressbar = tkinter.ttk.Progressbar(self.progress_window, style='text.Horizontal.TProgressbar',
variable=self.percentage_variable, maximum=500,length=450, mode="determinate")
self.progressbar.pack(pady=100)
self.done_progress = tkinter.Button(self.progress_window, text="Done", state=tkinter.DISABLED,command=self.update_progressbar)
self.done_progress.pack()
def update_progressbar(self):
self.percentage_variable.set(self.percentage_variable.get() + 10)
if __name__ == "__main__":
master = tkinter.Tk()
master.title("Test Runner")
master.geometry("750x500")
middle_buttons_class().Run_Button()
master.mainloop()
請查看Python Naming Convention ,它將有助於提高代碼的可讀性。
您必須初始化一個新對象:
def run_robot_files(self):
print("Tasks started")
progressBar = progress_bar()
progressBar.progress_bar_thread()
progressBar.done_progress.config(state=tkinter.NORMAL)
您不能在此處初始化新實例:
def progress_bar_thread(self):
progress_bar_class = progress_bar()
所以將其更改為:
def progress_bar_thread(self):
progress_bar_class = self
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.