Проблема с декоратором callback_query_handler в python / telegram
недавно начал изучать разработку телеграм ботов на пайтоне с помощью телебот, возникла проблема с кодом, именно с обработкой результатов нажатия кнопок, вот сам код:
def start(message):
mess = f'Поехали <b>{message.from_user.first_name}</b>, введи /go'
bot.send_message(message.chat.id, mess, parse_mode='html')
@bot.message_handler(commands=['go'])
def go(message):
markup = types.InlineKeyboardMarkup(row_width=2)
markup.add(types.InlineKeyboardButton('Кнопка 1', callback_data='1'))
markup.add(types.InlineKeyboardButton('Кнопка 2', callback_data='2'))
markup.add(types.InlineKeyboardButton('Кнопка 3', callback_data='3'))
bot.send_message(message.chat.id, 'Сообщение', reply_markup=markup)
@bot.callback_query_handler(func = lambda call: True)
def answer(call):
if call.data == '1':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка A', callback_data='a'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
elif call.data == '2':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка B', callback_data='b'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
elif call.data == '3':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка C', callback_data='c'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
#Вот здесь после обработки второго хэндлера, он должен слать сообщение, допустим "123",
я так понимаю что он обрабатывает предыдущий хэндлер с кнопками 1,2,3,
не приступая к хэндлеру с кнопками А,В,С, каким образом это исправить?
@bot.callback_query_handler(func = lambda call: True)
def answer(call):
if call.data == 'a':
bot.send_message(call.from_user.id, '123')
@bot.message_handler()
def get_user_text(message):
bot.send_message(message.chat.id, 'Введи корректную команду')
bot.polling(none_stop=True)```
Ответы (1 шт):
Автор решения: mazik7512
→ Ссылка
У вас первый хендлер перехватывает, все callback-сообщения. Вам следует либо изменить лямбду с lambda call: True на отслеживание конкретных команд, например lambda call: call.data == '1' or call.data == '2'.
Либо использовать функция register_next_step_handler и изменить код.
@bot.callback_query_handler(func = lambda call: True)
def answer(call):
if call.data == '1':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка A', callback_data='a'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
elif call.data == '2':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка B', callback_data='b'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
elif call.data == '3':
markup_reply = types.InlineKeyboardMarkup()
markup_reply.add(types.InlineKeyboardButton('Кнопка C', callback_data='c'))
bot.send_message(call.from_user.id, 'Выбери кнопку', reply_markup=markup_reply)
bot.register_next_step_handler(call, answer1)
def answer1(call):
if call.data == 'a':
bot.send_message(call.from_user.id, '123')