В Tkinter имя метода не определено, хотя он там есть

Пишу приложение в библиотеке Python. Его интерфейс запускается, однако функционал не работает:

NameError: name 'answerQuery' is not defined

В приведенном коде выходит такая ошибка:

AttributeError: 'QuestionsAnswers' object has no attribute 'clearText'

Что не так?

Если не концентрироваться на ООП, то без классов программа работает. Но не в этом случае.

Привожу усеченный код:

import random
import time
import tkinter as tk

RESPONSES = ['Да', 'Нет']
class QuestionsAnswers(tk.Frame):
    def __init__(self, main):
        tk.Frame.__init__(self, main)
        self.main = main
        self.frame_question_answer = tk.Frame(master=self.main)
        self.frame_answer = tk.Frame(master=self.main)
        self.text_box_question = tk.Text(master=self.frame_question_answer)
        self.text_box_answer = tk.Text(master=self.frame_answer)
        self.button_ask = tk.Button(master=self.frame_question_answer,text='Спросить')
        self.button_clear = tk.Button(master=self.frame_question_answer,text='Очистить')

        self.frame_question_answer.grid(row=0, column=0,columnspan=1,sticky='e')
        self.frame_answer.grid(row=0, column=1, columnspan = 1, sticky='w')                         
        self.text_box_question.grid(row=0, column=0,sticky='news')                                               
        self.text_box_answer.grid(row=0, column=0,sticky='news')                       
        self.button_ask.grid(row=3, column=0, sticky='ew')
        self.button_clear.grid(row=3, column=1, sticky='ew')

        self.button_ask.bind('<Button>', self.questionQuery) 
        self.button_clear.bind('<Button>', self.clearText)

    def questionQuery(self, event):
        """Обработчик вопросов пользователя"""
        question = self.text_box_question.get('1.0', tk.END) # читаем текст из виджета 
        main.update_idletasks()  
        main.after(2000, lambda: self.button_ask.configure(text='Спросить'))  
        if not question.strip():
            self.text_box_answer.insert(tk.END, 'Задайте свой вопрос\n') 
        else:
            answerQuery(self, event)                
                    
        
    def answerQuery(self, event):
        """Функция возвращает случайные ответы"""
        time.sleep(2)
        self.text_box_answer.insert(tk.END, 'Хмм...' + '\n') # и выводим в виджет text_box_answer
        self.main.update_idletasks()
        time.sleep(2)
        self.text_box_answer.insert(tk.END, 'Я заглядываю за повороты судьбы, чтобы узнать о грядущем' + '\n')
        self.main.update_idletasks()
        self.main.after(2000, lambda: self.text_box_answer.insert(tk.END, random.choice(RESPONSES) + '\n'))

if __name__ == '__main__':
    window = tk.Tk()
    window.title('Магический шар')
    window.resizable(0, 0)
    window.wm_attributes('-topmost', 1)
    
    quest_answer = QuestionsAnswers(window)
    
    window.mainloop()                 


Ответы (2 шт):

Автор решения: GrAnd

В приведенном коде выходит такая ошибка:

AttributeError: 'QuestionsAnswers' object has no attribute 'clearText'

В приведённом коде что-то не видно метода clearText(self, ...) у класса QuestionsAnswers. Так что всё верно ругается.


Его интерфейс запускается, однако функционал не работает:

NameError: name 'answerQuery' is not defined

Ну так вы вызываете глобальную/локальную функцию answerQuery(self, event). Которой тоже нет. Метод экземпляра класса вызывается по другому: self.answerQuery(event).

→ Ссылка
Автор решения: S. Nick

Попробуйте так:

import random
import time
import tkinter as tk

RESPONSES = ['Да', 'Нет']

class QuestionsAnswers(tk.Frame):
    def __init__(self, main):
        tk.Frame.__init__(self, main)
        self.main = main
        self.frame_question_answer = tk.Frame(master=self.main)
        self.frame_answer = tk.Frame(master=self.main)
        self.text_box_question = tk.Text(master=self.frame_question_answer)
        self.text_box_answer = tk.Text(master=self.frame_answer)
        self.button_ask = tk.Button(master=self.frame_question_answer,text='Спросить')
        self.button_clear = tk.Button(master=self.frame_question_answer,text='Очистить')

        self.frame_question_answer.grid(row=0, column=0,columnspan=1,sticky='e')
        self.frame_answer.grid(row=0, column=1, columnspan = 1, sticky='w')                         
        self.text_box_question.grid(row=0, column=0,sticky='news')                                               
        self.text_box_answer.grid(row=0, column=0,sticky='news')                       
        self.button_ask.grid(row=3, column=0, sticky='ew')
        self.button_clear.grid(row=3, column=1, sticky='ew')

        self.button_ask.bind('<Button>', self.questionQuery) 
        self.button_clear.bind('<Button>', self.clearText)

    def questionQuery(self, event):
        """Обработчик вопросов пользователя"""
        question = self.text_box_question.get('1.0', tk.END) # читаем текст из виджета 

        self.main.update_idletasks()  
        self.main.after(2000, lambda: self.button_ask.configure(text='Спросить'))  

        if not question.strip():
            self.text_box_answer.insert(tk.END, 'Задайте свой вопрос\n') 
        else:
            self.answerQuery()                
        
    def answerQuery(self):
        """Функция возвращает случайные ответы"""
        time.sleep(1)
        self.text_box_answer.insert(tk.END, 'Хмм...' + '\n') # и выводим в виджет text_box_answer
        self.main.update_idletasks()
        time.sleep(1)
        self.text_box_answer.insert(tk.END, 'Я заглядываю за повороты судьбы, чтобы узнать о грядущем' + '\n')
        self.main.update_idletasks()
        self.main.after(2000, lambda: self.text_box_answer.insert(tk.END, random.choice(RESPONSES) + '\n'))

    def clearText(self, event):
        self.text_box_answer.delete('1.0', tk.END)
    
    
if __name__ == '__main__':
    window = tk.Tk()
    window.title('Магический шар')
    window.resizable(0, 0)
    window.wm_attributes('-topmost', 1)
    quest_answer = QuestionsAnswers(window)
    window.mainloop()  

введите сюда описание изображения

→ Ссылка