Кнопки должны отображаться каждая в отдельной строке
В этом варианте кода должно появляться меню с кнопками, берущими информацию из JSON-файла, количество кнопок может варьироваться (в тестовом варианте их 3). Проблема в том, что кнопки отображаются в одной строке, а должны отображаться каждая в отдельной строке. Далее по коду при нажатии кнопки будет вызываться следующее меню с выбором:
with open('menu.json', 'r', encoding='utf-8') as f:
MENU = json.load(f)
@dp.message(lambda message: message.text.casefold() == '? меню')
async def show_menu(message: types.Message):
text = '☕ *Меню кав’ярні:*\n\n'
menu_buttons = InlineKeyboardBuilder()
# Додаємо категорії
text += 'Виберіть категорію товарів:\n'
for category in MENU['categories']:
# Додаємо кнопку для кожної категорії
menu_buttons.button(text=category['name'], callback_data=f'category_{category["id"]}')
# Відправляємо повідомлення з меню
await message.answer(text, reply_markup=menu_buttons.as_markup(resize_keyboard=True))
Ответы (1 шт):
Автор решения: Sherlock
→ Ссылка
У InlineKeyboardBuilder есть параметр adjust который как раз и отвечает за сетку кнопок, после вашего цикла, вы можете указать menu_buttons.adjust(1) и ваши кнопки будут каждая в своем ряду.
with open('menu.json', 'r', encoding='utf-8') as f:
MENU = json.load(f)
@dp.message(lambda message: message.text.casefold() == '? меню')
async def show_menu(message: types.Message):
text = '☕ *Меню кав’ярні:*\n\n'
menu_buttons = InlineKeyboardBuilder()
# Додаємо категорії
text += 'Виберіть категорію товарів:\n'
for category in MENU['categories']:
# Додаємо кнопку для кожної категорії
menu_buttons.button(text=category['name'], callback_data=f'category_{category["id"]}')
menu_buttons.adjust(1) # <- ТУТ НОВОЕ
# Відправляємо повідомлення з меню
await message.answer(text, reply_markup=menu_buttons.as_markup(resize_keyboard=True))