Динамическая inline клавиатура в telegram на Python

Как создать клавиатуру из списка? Список формируется из SQL запроса. Например:

list_of_animals = ['cat','dog','mouse']

Ниже привел пример статической клавиатуры.

kb = types.InlineKeyboardMarkup()
kb_dog = types.InlineKeyboardButton(text='Собаку', callback_data='dog')
kb_cat = types.InlineKeyboardButton(text='Кошку', callback_data='cat')
kb_mouse = types.InlineKeyboardButton(text='Мышь', callback_data='mouse')
kb.add(kb_dog, kb_cat, kb_mouse)

@dp.message_handler(commands=['start'])
async def start(message):
    await bot.send_message(message.chat.id, 'Привет', reply_markup=kb)


@dp.callback_query_handler(lambda call: True)
async def callback_inline(call):
    if call.data == 'dog':
        await bot.send_message(call.message.chat.id, 'Собаку так собаку')

    elif call.data == 'cat':
        await bot.send_message(call.message.chat.id, 'Котиков все любят')

    elif call.data == 'mouse':
        await bot.send_message(call.message.chat.id, 'Серьёзно, мышь?')

Ответы (1 шт):

Автор решения: Данила Граф

Здравствуй! Сам давно задаюсь этим вопросом, что написать более качественный код. На данный момент времени могу тебе предложить пойти в лоб решения данной проблемы:

kb = types.InlineKeyboardMarkup()
for item in list_of_animals:
    kb.add(types.InlineKeyboardButton(text=item, callback_data=item))

@dp.callback_query_handler(lambda call: True)
async def callback_inline(call):
    if call.data == 'dog':
        await bot.send_message(call.message.chat.id, 'Собаку так собаку')

    elif call.data == 'cat':
        await bot.send_message(call.message.chat.id, 'Котиков все любят')

    elif call.data == 'mouse':
        await bot.send_message(call.message.chat.id, 'Серьёзно, мышь?')`

Как только я найду более продуктивный способ реализации, обязательно отвечу! Успехов тебе. Надеюсь, я тебе помог

→ Ссылка