Python tkinter - объект не имеет атрибута - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь изменить состояние кнопки, но я получаю сообщение об ошибке атрибута, вот копия полного отзыва для справки:

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

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Итак, ваша проблема в том, что вы пытаетесь редактировать из 2 отдельных экземпляров progress_bar(). Вам нужно создать переменную для работы, а затем отредактировать оттуда атрибуты класса. Я также изменил вашу цель потока, чтобы использовать 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()
0 голосов
/ 29 октября 2018

Пожалуйста, ознакомьтесь с Соглашением об именах Python , ваш код практически не читается.

Прежде всего вам нужно инициализировать новый объект.

def run_robot_files(self):

    print("Tasks started")
    progressBar = progress_bar()
    progressBar.progress_bar_thread()
    progressBar.done_progress.config(state=tkinter.NORMAL)

U не может инициализировать новый экземпляр здесь:

def progress_bar_thread(self):
    progress_bar_class = progress_bar()

Изменить его на:

def progress_bar_thread(self):
    progress_bar_class = self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...