aiogram 3 python - проблема с InlineKeyboardBuilder

Всем привет, столкнулся с проблемой - моя неопытность, незаконченная база питона. Не могли бы Вы помочь с InlineKeyboardBuilder.

potatiki = ('Красные', 'Зеленые', 'Желтые')

Допустим это наша таблица в базе данных. Как с помощью InlineKeyboardBuilder сделать столько кнопок сколько в этом множестве? И также для каждой кнопки создать callback с уникальным именем?

potatiki = ('Красные', 'Зеленые', 'Желтые')

def potato():
keyboard = InlineKeyboardBuilder()
for potat in potatiki:
    keyboard.add(InlineKeyboardButton(text=potat, callback_data="potato"))
return keyboard.adjust(3).as_markup(resize_keyboard=True)

Пытался сделать как-то так, но у каждой кнопки как видите callback один и тот же, так как же сделать чтобы его можно было менять?

Приведу пример: Есть каталог магазина: Шапки - (Крутые, Модные, Стильные): В инлайн кнопки созданные с помощью билдера с названиями Крутые, Модные, Стильные, которые хранились в БД, как дать им разные CallBack

Очень надеюсь на ответ, заранее всем спасибо!

UPD*

def potato():
count = 0
keyboard = InlineKeyboardBuilder()
for potat in potatiki:
    keyboard.add(InlineKeyboardButton(text=potat, callback_data="potato" + str(count)))
    count += 1
return keyboard.adjust(3).as_markup(resize_keyboard=True)

Сделал такой код, колхоз?


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

Автор решения: Samikague

Давайте будем ориентироваться на ваш код в "UPD". Буду рассматривать самое простое решение проблемы.

  1. Функция должна быть асинхронной (aiogram все таки)

    async def potato():
    
  2. Думаю, будет удобнее передавать все же список, т.е. заключать значение в квадратные скобки []:

    potatiki = ['potatik1', 'potatik2' ...]
    
  3. Удобнее создание кнопок осуществлять не через keyboard.add, а через keyboard.button:

    keyboard.button(text=..., callback_data=...)
    
  4. В callback_data будет везде 0, потому что вы добавляете 1 только после самого добавления кнопок, т.е., нужно переставить добавление значения в начало.

После всех этих манипуляций код должен выглядеть так:

async def potato():
    count = 0
    keyboard = InlineKeyboardBuilder()
    for potat in potatiki:
        count += 1
        keyboard.button(text=potat, callback_data=f'potat_{count}')
return keyboard.adjust(3).as_markup(
→ Ссылка