«AttributeError: объект« Описание »не имеет атрибута« co_button »» с tkinter - PullRequest
1 голос
/ 08 мая 2019

Я бьюсь уже около 2 часов знаю .. Я не вижу, что не так с кодом.Но это дает мне эту ошибку.

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\82104\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\82104\PycharmProjects\Macro\GUI.py", line 365, in on_entry_trace
    self.co_button['state']=new_state
AttributeError: 'Description' object has no attribute 'co_button'

Я понятия не имею, что означает первая ошибка в строке 1705, но по второй ошибке я вижу, что моя функция on_entry_trace не может найти self.co_button.Однако я не могу найти, почему это не может.Я обнаружил, что у многих людей была эта проблема, потому что они писали как

button = ttk.Button(something).grid(something)

вместо

button = ttk.Button(something)
button.grid(something)

, но это не мой случай.

Это класс IУ меня проблемы с.

class Description(tk.Toplevel):
    def __init__(self, master=None):
        super(Description, self).__init__(master=master)

        self.title('Description')
        self.grab_set()
        self.geometry('206x100')
        self.resizable(False, False)

        self.label_ds = ttk.Label(self, text='Enter Text').grid(column=0, row=0, pady=(12, 4))
        self.description = tk.StringVar()
        entry_ds = ttk.Entry(self, width=25, textvariable=self.description)
        entry_ds.grid(column=0, row=1, padx=13, pady=(0, 4))
        entry_ds.focus()
        self.description.trace('w', self.on_entry_trace)
        self.description.set("")

        self.co_button = ttk.Button(self, text='Confirm', command=self.on_press_ds)
        self.co_button.grid(column=0, row=2, pady=4)

        self.protocol("WM_DELETE_WINDOW", self.destroy_ds)

        self.wait_visibility()
        hide_minimize_maximize(self)

    def on_entry_trace(self, *args):
        new_state = "disabled" if self.description.get() == "" else "normal"
        self.co_button.configure(state=new_state)

    def on_press_ds(self):
        description = self.description.get()
        if description:
            self.master.listbox.insert('end', '-- ' + description + ' --')
        self.destroy_ds()
        self.destroy()

    def destroy_ds(self):
        self.master.ds_button['state'] = 'normal'
        self.destroy()

1 Ответ

2 голосов
/ 08 мая 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что метод трассировки виджета Entry self.description.trace('w', self.on_entry_trace) вызывает метод self.on_entry_trace до объявления co_button.

Я понятия не имею, чтоПервая ошибка в строке 1705 означает

Это строка из основной библиотеки tkinter, где return self.func(*args) не удалось выполнить из-за строки 365 в вашем файле.


Вот как это работает

Python читает как ...

    ....

    entry_ds.focus()
    # This will execute after above line 
    self.description.trace('w', self.on_entry_trace)
    # Then goes through self.on_entry_trace()
    ...
      # This will execute next
      new_state = "disabled" if self.description.get() == "" else "normal"
      # And here it'll throw an error as there is no attribute 
      self.co_button.configure(state=new_state)
    ...

    self.description.set("")
    ....

    # And you declared your button here
    self.co_button = ttk.Button(self, text='Confirm', command=self.on_press_ds)
    self.co_button.grid(column=0, row=2, pady=4)

Итак, поставив self.description.trace('w', self.on_entry_trace) в конце вашего __init__исправит ошибку, а также уменьшит вероятность будущих ошибок, подобных этой.


Совет:

Лучший способ поставить binds и traceили after находится в конце кода, чтобы избежать этих мелких ошибок.Это также зависит от вашей стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...