簡體   English   中英

Python tkinter-對象沒有屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM