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

Магия кнопок в Telegram - создаём интерактивные клавиатуры с помощью ReplyKeyboardMarkup

Чтобы создать кнопки, создайте файл keyboards.py в папке app.

Затем в этом файле напишите код:

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
main = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text='Корзина')],
[KeyboardButton(text='Контакты')]
])
-2

В файле keyboards.py создаётся переменная main, которая является экземпляром объекта ReplyKeyboardMarkup — класса, предназначенного для создания клавиатуры.

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

Теперь необходимо вызвать эту клавиатуру. Она может быть открыта только при отправке определённого сообщения (апдейта). Для этого клавиатура будет открываться при отправке команды /start.

-3
from aiogram import Router, F
from aiogram.types import Message
from aiogram.filters import CommandStart
import app.keyboards as kb
router = Router() @router.message(CommandStart())
async def cmd_start(message: Message):
await message.answer(f'Привет!', reply_markup=kb.main)

Чтобы избежать конфликта имён, при импорте модуля клавиатуры используется псевдоним kb. В дальнейшем обращение к клавиатуре будет происходить через эту переменную.

При отправке сообщения добавлен аргумент reply_markup, который позволяет открыть клавиатуру. Передав в этот аргумент переменную main, в Telegram можно увидеть созданную клавиатуру:

-4

Кнопки автоматически адаптируются под размер клавиатуры телефона, но если вам нужно изменить их размер (если он не подходит), вы можете использовать специальные методы:

-5
main = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text='Корзина')],
[KeyboardButton(text='Контакты')]
],
resize_keyboard=True,
input_field_placeholder='Выберите пункт меню.')

С помощью метода resize_keyboard можно уменьшить размер кнопок до минимального. А метод input_field_placeholder позволяет задать значение для поля ввода сообщения:

-6

Когда пользователь нажимает на кнопку типа Reply (например, «Корзина» или «Контакты»), текст с этой кнопки отправляется в виде сообщения.

Эти сообщения можно обрабатывать с помощью хэндлеров:

-7
@router.message(F.text == 'Корзина')
async def basket(message: Message):
await message.answer('В вашей корзине пусто.')

Эти кнопки удобны для простых и лёгких действий, но могут вызвать сложности при создании сложных ботов. В отличие от callback-кнопок, через них нельзя передать дополнительную информацию. Кроме того, их использование может затруднить отправку сообщений в чат.

Однако у клавиатуры Reply есть и другие функции. Например, с её помощью можно запросить контакт или местоположение пользователя. Для этого нужно добавить дополнительный аргумент при создании кнопок:

-8
main = ReplyKeyboardMarkup(keyboard=[
[KeyboardButton(text='Корзина')],
[KeyboardButton(text='Контакты')],
[KeyboardButton(text='Отправить локацию', request_location=True),
KeyboardButton(text='Отправить контакт', request_contact=True)]
],
resize_keyboard=True,
input_field_placeholder='Выберите пункт меню.')

При нажатии на эти кнопки местоположение или контакт автоматически отправляются в чат. Обратите внимание: я добавил эти две кнопки в один список, поэтому они будут находиться в одном ряду.

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

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