Создание обработчика по нажатию на inline кнопки и получение текста этой кнопки
Создаю телеграм бота на основе telebot У меня динамически создаются кнопки в массиве
keyboard = InlineKeyboardMarkup()
keyboard.row_width = 2
for i in range(0, len(adress)):
keyboard.add(InlineKeyboardButton(adress[i].text, callback_data=adress[i].text))
bot.send_message(cid, 'Выберите адрес парковки', reply_markup=keyboard)
Как мне отследить нажатие одной из кнопок и получить из неё текст? У всех кнопок разный callback_data
Если бы я знал их callback_date, то я бы сделал так:
@bot.callback_query_handler(func=lambda c:True)
def ans(c):
cid = c.message.chat.id
if c.data == "callback_data":
Но как это сделать в моём случае если callback_data формируется динамически?
Ответы (2 шт):
Автор решения: MyZik
→ Ссылка
keyboard = InlineKeyboardMarkup()
keyboard.row_width = 2
for i in range(0, len(adress)):
keyboard.add(InlineKeyboardButton(adress[i].text, callback_data=f"address_{adress[i].text}"))
bot.send_message(cid, 'Выберите адрес парковки', reply_markup=keyboard)
Хэндлер:
@bot.callback_query_handler(lambda query: query.data.startswith("address_"))
def ans(query):
chat_id = query.message.chat.id
address = query.data.split("_")[1] # адрес, с которым можно работать
Автор решения: Илья
→ Ссылка
В callback_data указывайте адрес callback_data=f"address_{adress[i].text}"
Обработчик
@bot.callback_query_handler(lambda query: query.data.startswith("address_")) def ans(query): str = query.data res_str = str.replace('address_', '')
В переменной res_str будет callback_data вашей кнопки