Телеграм-бот. Обрывается цикл диалога, после одного неверного ответа
Пишу бота в PyCharm для Телеграма, ещё учусь и в этом деле полный новичок. Возникла проблема, суть бота - это калькулятор. Всё работает исправно, запоминает пользовательские данные, считает всё правильно, но стоит написать текст, вместо цифры как цикл прекращается. Есть ли возможность сделать так, что бы он после неправильного момента, не прерывал цикл, а возвращался на последний вопрос?
@bot.message_handler(commands=['calculator'])
def send_welcome(message):
# комманда снизу уберёт клаиватуру юзера
markup = types.ReplyKeyboardRemove(selective=False)
msg = bot.send_message(message.chat.id, "Можем позаниматься математикой!\nВведи число:", reply_markup=markup)
bot.register_next_step_handler(msg, process_num1_step)
def process_num1_step(message, user_result = None):
try:
global user_num1
if user_result == None:
user_num1 = int(message.text)
else:
user_num1 = str(user_result)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
itembtn1 = types.KeyboardButton('+')
itembtn2 = types.KeyboardButton('-')
itembtn3 = types.KeyboardButton('*')
itembtn4 = types.KeyboardButton('/')
markup.add(itembtn1, itembtn2, itembtn3, itembtn4)
msg = bot.send_message(message.chat.id, "Что делаем?", reply_markup=markup)
bot.register_next_step_handler(msg, process_proc_step)
except Exception as e:
bot.reply_to(message, 'Это не число...\nВосьпользуйся этим: https://numl.org/IH1 ')
def process_proc_step(message):
try:
global user_proc
user_proc = message.text
markup = types.ReplyKeyboardRemove(selective=False)
msg = bot.send_message(message.chat.id, "Введите еще число:", reply_markup=markup)
bot.register_next_step_handler(msg, process_num2_step)
except Exception as e:
bot.reply_to(message, 'Вы ввели что то другое или что то пошло не так...')
def process_num2_step(message):
try:
global user_num2
user_num2 = int(message.text)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
itembtn1 = types.KeyboardButton('Что вышло?')
itembtn2 = types.KeyboardButton('Ещё кое что...')
markup.add(itembtn1, itembtn2)
msg = bot.send_message(message.chat.id, "Показать результат или продолжить операцию?", reply_markup=markup)
bot.register_next_step_handler(msg, process_alternative_step)
except Exception as e:
bot.reply_to(message, 'Это не число или что то пошло не так...')
def process_alternative_step(message):
try:
calc()
markup = types.ReplyKeyboardRemove(selective=False)
if message.text.lower() == 'что вышло?':
bot.send_message(message.chat.id, calcResultPrint(), reply_markup=markup)
elif message.text.lower() == 'ещё кое что...':
process_num1_step(message, user_result)
except Exception as e:
bot.reply_to(message, 'Что то пошло не так...')
def calcResultPrint():
global user_num1, user_num2, user_proc, user_result
return "Результат: " + str(user_num1) + ' ' + user_proc + ' ' + str(user_num2) + ' = ' + str( user_result )
# Вычисление
def calc():
global user_num1, user_num2, user_proc, user_result
user_result = eval(str(user_num1) + user_proc + str(user_num2))
return user_result
bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()
Ответы (1 шт):
Автор решения: Violet
→ Ссылка
def proc_kb():
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
btn1 = types.KeyboardButton('+')
btn2 = types.KeyboardButton('-')
btn3 = types.KeyboardButton('*')
btn4 = types.KeyboardButton('/')
markup.add(btn1, btn2, btn3, btn4)
return markup
@bot.message_handler(commands=['calculator'])
def calculator(message):
msg = bot.send_message(message.chat.id, "Можем позаниматься математикой!\nВведи число:")
bot.register_next_step_handler(msg, process_num1_step)
def process_num1_step(message):
if message.text.isdigit():
msg = bot.send_message(message.chat.id, "Что делаем?", reply_markup=proc_kb())
bot.register_next_step_handler(msg, process_proc_step, message.text)
else:
msg = bot.send_message(message.chat.id, 'это не число, повтори ввод')
bot.register_next_step_handler(msg, process_num1_step)
def process_proc_step(message, num_1):
print('process_proc_step')
print('num_1:', num_1)
print('proc:', message.text)
if message.text in ['+', '-', '*', '/']:
msg = bot.send_message(message.chat.id, "Введите еще число:")
bot.register_next_step_handler(msg, process_num2_step, num_1, message.text)
elif message.text.isdigit():
msg = bot.send_message(message.chat.id, 'сейчас число не требуется, повтори ввод', reply_markup=proc_kb())
bot.register_next_step_handler(msg, process_proc_step, num_1)
else:
msg = bot.send_message(message.chat.id, 'странная операция, повтори ввод', reply_markup=proc_kb())
bot.register_next_step_handler(msg, process_proc_step, num_1)
def process_num2_step(message, num_1, proc):
print('process_num2_step')
print('num_1:', num_1)
print('proc:', proc)
print('num_2:', message.text)
if message.text.isdigit():
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
result = types.KeyboardButton('Что вышло?')
add = types.KeyboardButton('Ещё кое что...')
markup.add(result, add)
msg = bot.send_message(message.chat.id, "Показать результат или продолжить операцию?", reply_markup=markup)
bot.register_next_step_handler(msg, process_alternative_step, num_1, proc, message.text)
else:
msg = bot.send_message(message.chat.id, 'это не число, повтори ввод')
bot.register_next_step_handler(msg, process_num2_step)
def process_alternative_step(message, num_1, proc, num_2):
print('process_alternative_step')
print('num_1:', num_1)
print('proc:', proc)
print('num_2:', num_2)
if message.text == 'Что вышло?':
bot.send_message(message.chat.id, f'{num_1} {proc} {num_2} = {eval(str(num_1) + proc + str(num_2))}')
bot.polling(none_stop=True)
- Используйте
isdigit()для того чтобы проверить содержит ли строка (сообщение пользователя) только цифры - вместо
globalможно воспользоваться дополнительными аргументами вbot.register_next_step_handler() - вычисление необязательно выносить в отдельную функцию, как и возврат результата, можно использовать f строки или тот же
.format()