В 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 шт):
В приведенном коде выходит такая ошибка:
AttributeError: 'QuestionsAnswers' object has no attribute 'clearText'
В приведённом коде что-то не видно метода clearText(self, ...) у класса QuestionsAnswers. Так что всё верно ругается.
Его интерфейс запускается, однако функционал не работает:
NameError: name 'answerQuery' is not defined
Ну так вы вызываете глобальную/локальную функцию answerQuery(self, event). Которой тоже нет. Метод экземпляра класса вызывается по другому: self.answerQuery(event).
Попробуйте так:
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()
