Как можно создать «Сложную» клавиатуру с помощью InlineKeyboardBuilder в библиотеке aiogram?

Как можно изменить текущий код, чтобы товары из базы данных отображались по два на строку, а кнопки "Оформить заказ" и "Назад" располагались по одной на отдельной строке в конце? У меня есть следующая структура для примера: <br/> <br/> Товар1 | Товар2 <br/> Товар3 | Товар4 <br/> Оформить заказ <br/> Назад <br/> <br/> Вот мой код:<br/> <pre><code class="python">async def create_catalog(tg_id: int):
    check = await *Функция которая проверяет наличие товара и возвращает  список с товарами в наличии()
    basket = await *Функция которая проверяет корзину пользователя и возвращает список с товарами в корзине(tg_id=tg_id)
    kb = InlineKeyboardBuilder()
    if not check:
        kb.add(InlineKeyboardButton(text='⚠️ В настоящее время наш магазин пуст', callback_data='none'))
    else:
        for i in check:
            quantity_products = 0
            
            for b in basket: 
                if b == i: 
                    quantity_products += 1
                    
            if quantity_products == 0:
                kb.add(InlineKeyboardButton(text=f'{i.category} - {i.price}₽', callback_data=f'{i.category}'))
            else:
                kb.add(InlineKeyboardButton(text=f'{i.category} - {i.price}₽ [{quantity_products}]', callback_data=f'{i.category}'))
        kb.adjust(2)
        kb.add(InlineKeyboardButton(text=' Оформить заказ', callback_data='buy'))
    kb.add(InlineKeyboardButton(text='↩️ Назад', callback_data='go_menu'))
    kb.adjust(1)
    return kb.as_markup()</code></pre> <br/> <br/> Обратите внимание, что `kb.adjust()` задаёт ширину для всей клавиатуры.
  • 29 марта 2025 г. 10:34
Ответы на вопрос 1
Чтобы создать «сложную» клавиатуру с использованием `InlineKeyboardBuilder` в библиотеке aiogram и отобразить товары по два на строку, а кнопки "Оформить заказ" и "Назад" на отдельных строках в конце, вам нужно немного изменить вашу функцию. Вот обновлённая версия вашего кода:

```python
async def create_catalog(tg_id: int):
    check = await *Функция которая проверяет наличие товара и возвращает список с товарами в наличии()
    basket = await *Функция которая проверяет корзину пользователя и возвращает список с товарами в корзине(tg_id=tg_id)
    kb = InlineKeyboardBuilder()
    
    if not check:
        kb.add(InlineKeyboardButton(text='⚠️ В настоящее время наш магазин пуст', callback_data='none'))
    else:
        for i in check:
            quantity_products = 0
            
            for b in basket: 
                if b == i: 
                    quantity_products += 1
                    
            if quantity_products == 0:
                kb.add(InlineKeyboardButton(text=f'{i.category} - {i.price}₽', callback_data=f'{i.category}'))
            else:
                kb.add(InlineKeyboardButton(text=f'{i.category} - {i.price}₽ [{quantity_products}]', callback_data=f'{i.category}'))
        
        # Корректировка клавиатуры, чтобы два товара располагались на одной строке
        kb.adjust(2)
        
        # Добавление кнопки «Оформить заказ» на отдельной строке
        kb.add(InlineKeyboardButton(text='🛒 Оформить заказ', callback_data='buy'))
        
        # Добавление кнопки «Назад» на отдельной строке
        kb.add(InlineKeyboardButton(text='↩️ Назад', callback_data='go_menu'))

    return kb.as_markup()
```

### Объяснение изменений:
1. **`kb.adjust(2)`**: Эта строка настроит клавиатуру, чтобы два товара отображались на одной строке.
2. **Добавление кнопок "Оформить заказ" и "Назад"**: После добавления всех товаров вы сразу добавляете кнопку "Оформить заказ", а затем кнопку "Назад". Это обеспечит, что они будут расположены на отдельных строках внизу клавиатуры.
3. **Объединение логики добавления товаров**: Весь процесс добавления кнопок для товаров остался без изменений, кроме настройки их отображения. 

Таким образом, вся клавиатура будет выглядеть согласно вашим требованиям.
Похожие вопросы