Помимо традиционного метода создания клавиатуры в aiogram, существует альтернативный способ — с использованием билдеров (Builder).
Представим, что у вас есть база данных, содержащая определённую информацию, например, о товарах. Из этой базы данных вы получаете список товаров:
data = ("Nike", "Adidas", "Reebok")
Из этого кортежа необходимо создать клавиатуру, при этом данные могут быть разными: товары можно добавлять или удалять из базы данных. В таком случае требуется создать динамическую клавиатуру. Это можно сделать и обычным способом:
from aiogram.types import (ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton)
data = ("Nike", "Adidas", "Reebok")
def brands():
buttons = [] for brand in data:
buttons.append([KeyboardButton(text=brand)])
keyboard = ReplyKeyboardMarkup(keyboard=buttons)
return keyboard
В теле функции brands создаётся список, в который добавляются другие списки. Это не очень удобно, поскольку мы не можем контролировать количество кнопок в строке.
Поэтому был разработан более удобный метод:
from aiogram.types import KeyboardButton, InlineKeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder
data = ("Nike", "Adidas", "Reebok")
def brands():
keyboard = ReplyKeyboardBuilder()
for brand in data:
keyboard.add(KeyboardButton(text=brand))
return keyboard.adjust(2).as_markup()
Мы добавляем кнопки напрямую в объект ReplyKeyboardBuilder, минуя работу со списками. Метод add позволяет добавлять кнопки, а метод adjust используется для регулирования количества кнопок в ряду после возврата из метода add. В конце необходимо обязательно указать as_markup().
Обратите внимание: я создал новый файл builder.py в папке app.
В хэндлерах клавиатура задаётся аналогичным образом:
И опять же, абсолютно аналогично всё работает с InlineKeyboardBuilder.
P.S. Даже если эта статья потеряет свою актуальность, она всё равно будет служить мне напоминанием о некоторых командах и избавит меня от необходимости искать их снова в интернете. Возможно, спустя пару лет я вернусь к этой статье и освежу свои знания. А тем, кто дочитал до конца, я желаю, чтобы ваши труды, проекты и творческие работы всегда оставались актуальными и востребованными! =)