проблема с методом register_next_step_handler в телебот на пайтон
import telebot
import random
from telebot import types
bot = telebot.TeleBot("6910621516:A*******************")
@bot.message_handler(commands=['help',"start"])
def start(message):
murkup = types.ReplyKeyboardMarkup(resize_keyboard = True)
button1 = types.InlineKeyboardButton("да")
button2 = types.InlineKeyboardButton("нет")
murkup.add(button1, button2)
bot.send_message(message.chat.id, text = 'Привет, {0.first_name}! Поиграем в угадай слово'.format(message.from_user), reply_markup = murkup)
@bot.message_handler(content_types = ["text"])
def func(message):
riddle = {"Как у западных и южных славян назывались селение, деревня, курень?":"жупа",
"Человеческие способности довольно велики. Например, мы можем собственными силами разогнать воздушный поток до 150–170 км/ч. В процессе чего человек способен произвести такой воздушный поток?":"чихание",
"Польский ученый-математик Гуго Дионисий Штейнгауз, прославившийся также своими афоризмами, говорил: «Комплимент женщине должен быть правдивее, чем»":"правда",
"В Швеции существует налог на собак, от которого многие пытаются уклониться. В налоговой инспекции в Стокгольме придумали забавный способ борьбы с неплательщиками: сотрудница службы Эльфрида Карлсон ходит по домам и делает это":"гавкает",
"Что использовали в Китае для глажки белья вместо утюга?":"сковордка",
" По традиции в Китае муж может в одностороннем порядке объявить о расторжении брака по семейным обстоятельствам. Назовите одну из причин для этого":"болтливость",
}
riddle_word,answer = random.choice(list(riddle.items()))
if message.text == "да":
msg = bot.send_message(message.from_user.id,text = "Угадывайте по одной букве или введите слово целиком")
bot.send_message(message.from_user.id,text = riddle_word)
f = ["*" for i in range(0,len(answer))]
while True:
f_word = "".join(f)
bot.send_message(message.from_user.id,text = f_word)
bot.register_next_step_handler(msg,answer_word)
if f_word == answer:
bot.send_message(message.chat.id, text = "Вы угадали слово. Молодец!!!")
break
elif text == answer:
bot.send_message(message.chat.id, text = "Вы угадали слово. Молодец!!!")
break
else:
bot.send_message(message.chat.id, text = "Очень жальь....")
def answer_word(message):
if message.text in answer:
bot.send_message(message.chat.id, text = "Вы угадали")
for i in range(0,len(answer)):
if answer[i] == text:
f[i] = text
else:
bot.send_message(message.chat.id, text = "Вы не угадали")
bot.polling(none_stop=True)
Я создаю игру в телеграмм боте, что-то типо поле чудес. И столкнулся с проблемой: бот не ждет ответа от пользователя и сразу начинает выполнять код. Думал решить эту проблему с помощью метода register_next_step_handler проверил эго работу на простом примере и начал перетаскивать в исходный код в у меня появилась ошибка. "cannot access local variable "answer_local" where it is not as sociated with a value". Посмотрел в интеренете, но ничего ценного не нашел.Также пробывал перетаскивать функцию внутрь цикла, но ничего не помогло. Как мне решить эту проблему или может есть другой метод,чтобы бот ожидал сообщения от пользователя?
Ответы (1 шт):
упрощённый пример исходя из вашего кода.
riddle, riddle_word и answer определяем до хэндлеров и функций:
from random import choice
import telebot
from telebot import types
from const import bot_token
bot = telebot.TeleBot(bot_token)
riddle = {"Как у западных и южных славян назывались селение, деревня, курень?": "жупа",
"Человеческие способности довольно велики. Например, мы можем собственными силами разогнать воздушный "
"поток до 150–170 км/ч. В процессе чего человек способен произвести такой воздушный поток?": "чихание",
"Польский ученый-математик Гуго Дионисий Штейнгауз, прославившийся также своими афоризмами, говорил: "
"«Комплимент женщине должен быть правдивее, чем»": "правда",
"В Швеции существует налог на собак, от которого многие пытаются уклониться. В налоговой инспекции в "
"Стокгольме придумали забавный способ борьбы с неплательщиками: сотрудница службы Эльфрида Карлсон ходит "
"по домам и делает это": "гавкает",
"Что использовали в Китае для глажки белья вместо утюга?": "сковордка",
" По традиции в Китае муж может в одностороннем порядке объявить о расторжении брака по семейным "
"обстоятельствам. Назовите одну из причин для этого": "болтливость",
}
riddle_word, answer = choice(list(riddle.items()))
используем one time keyboard чтобы скрыть кнопки "да", "нет" после выбора:
@bot.message_handler(commands=['help', "start"])
def start(message):
markup = types.ReplyKeyboardMarkup(True, True)
если выбрано "да", отправляем riddle_word и ожидаем ответ от пользователя (функция answer_word не должна быть вложена в if):
@bot.message_handler(content_types=["text"])
def func(message):
if message.text == "да":
msg = bot.send_message(message.from_user.id, f'Угадывайте по одной букве или введите слово целиком\n'
f'{riddle_word}')
bot.register_next_step_handler(msg, answer_word)
def answer_word(message):
if message.text.lower() == answer:
bot.send_message(message.chat.id, "Вы угадали")
else:
bot.send_message(message.chat.id, "Вы не угадали")
bot.polling(none_stop=True)
message.text.lower() - приводим ответ пользователя в нижний регистр, чтобы корректно сравнивать с ответом в словаре.
