Перейти к содержимому

Inline-клавиатуры

InlineKeyboard — билдер для создания кнопок под сообщениями Telegram. Кнопки могут вызывать callback или открывать ссылки.

from edgebot import Bot, Context, InlineKeyboard
bot = Bot(token, parse_mode="Markdown")
@bot.on_command("/menu")
async def menu(ctx: Context):
kb = InlineKeyboard()
kb.button("📋 Профиль", callback_data="profile")
kb.button("⚙️ Настройки", callback_data="settings")
kb.row()
kb.button("📖 Документация", url="https://edgebot.donvalerio.com")
await ctx.send("Выберите действие:", reply_markup=kb.build())
@bot.on_callback
async def on_callback(ctx: Context):
if ctx.callback_data == "profile":
await ctx.edit_message("Вы выбрали профиль")
elif ctx.callback_data == "settings":
await ctx.edit_message("Вы выбрали настройки")
await ctx.answer_callback()

По умолчанию все кнопки добавляются в один ряд. Вызов .row() начинает новый ряд:

kb = InlineKeyboard()
kb.button("1", callback_data="1")
kb.button("2", callback_data="2") # [1] [2] — один ряд
kb.row()
kb.button("3", callback_data="3") # [3] — новый ряд

Результат:

[ 1 ] [ 2 ]
[ 3 ]

Все методы InlineKeyboard возвращают self, поэтому вызовы можно чейнить:

kb = (
InlineKeyboard()
.button("Да", callback_data="yes")
.button("Нет", callback_data="no")
.row()
.button("Отмена", callback_data="cancel")
)

Метод .extend(other) добавляет ряды одной клавиатуры к другой:

common_footer = InlineKeyboard()
common_footer.button("🏠 Главная", callback_data="home")
common_footer.button("❓ Помощь", callback_data="help")
kb = InlineKeyboard()
kb.button("⚡ Действие", callback_data="action")
kb.extend(common_footer)

Результат:

[ ⚡ Действие ]
[ 🏠 Главная ] [ ❓ Помощь ]

При нажатии на inline-кнопку Telegram отправляет callback query. Обработчик получает ctx.callback_data с данными кнопки:

@bot.on_callback
async def handle(ctx: Context):
data = ctx.callback_data # строка из callback_data кнопки
await ctx.edit_message(f"Вы нажали: {data}")
# Обязательно ответить на callback, чтобы убрать «часики»
await ctx.answer_callback()
# Тихое уведомление (toast)
await ctx.answer_callback("Сохранено ✓")
# Модальное окно (alert)
await ctx.answer_callback("Вы уверены?", show_alert=True)

При использовании совместно с UI-компонентами, callback_data поддерживает концепцию путей:

callback_dataprefixРезультат
"toggle""prof""prof:toggle"
"toggle"None"toggle"
"/menu:home"любой"menu:home"
  • Относительный путь ("toggle") — при build(prefix="prof") превращается в "prof:toggle"
  • Абсолютный путь ("/menu:home") — всегда "menu:home", префикс игнорируется

Это позволяет кнопкам одного экрана ссылаться на другие экраны:

kb = InlineKeyboard()
kb.button("Действие", callback_data="action") # → "prof:action"
kb.row()
kb.button("🏠 Меню", callback_data="/menu:home") # → "menu:home"