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_callbackasync 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 ]Chaining
Заголовок раздела «Chaining»Все методы 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_callbackasync def handle(ctx: Context): data = ctx.callback_data # строка из callback_data кнопки
await ctx.edit_message(f"Вы нажали: {data}")
# Обязательно ответить на callback, чтобы убрать «часики» await ctx.answer_callback()answer_callback с уведомлением
Заголовок раздела «answer_callback с уведомлением»# Тихое уведомление (toast)await ctx.answer_callback("Сохранено ✓")
# Модальное окно (alert)await ctx.answer_callback("Вы уверены?", show_alert=True)Относительные и абсолютные пути
Заголовок раздела «Относительные и абсолютные пути»При использовании совместно с UI-компонентами, callback_data поддерживает концепцию путей:
| callback_data | prefix | Результат |
|---|---|---|
"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"