Найти тему
Ботоводство на Python

KeyboardBuilder — конструктор клавиатур для ваших ботов

Помимо традиционного метода создания клавиатуры в aiogram, существует альтернативный способ — с использованием билдеров (Builder).

Представим, что у вас есть база данных, содержащая определённую информацию, например, о товарах. Из этой базы данных вы получаете список товаров:

data = ("Nike", "Adidas", "Reebok")

Из этого кортежа необходимо создать клавиатуру, при этом данные могут быть разными: товары можно добавлять или удалять из базы данных. В таком случае требуется создать динамическую клавиатуру. Это можно сделать и обычным способом:

-2
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 создаётся список, в который добавляются другие списки. Это не очень удобно, поскольку мы не можем контролировать количество кнопок в строке.
Поэтому был разработан более удобный метод:

-3
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().

-4

Обратите внимание: я создал новый файл builder.py в папке app.

В хэндлерах клавиатура задаётся аналогичным образом:

-5

И опять же, абсолютно аналогично всё работает с InlineKeyboardBuilder.

P.S. Даже если эта статья потеряет свою актуальность, она всё равно будет служить мне напоминанием о некоторых командах и избавит меня от необходимости искать их снова в интернете. Возможно, спустя пару лет я вернусь к этой статье и освежу свои знания. А тем, кто дочитал до конца, я желаю, чтобы ваши труды, проекты и творческие работы всегда оставались актуальными и востребованными! =)

Не забудьте почитать: