⌨️ Клавиатуры

В Raito два декоратора клавиатур. Оба возвращают готовую разметку aiogram, поэтому вам не нужно возиться с билдерами или объектами разметки на месте вызова.

  • @rt.keyboard.static описывает раскладку через возвращаемое значение функции;

  • @rt.keyboard.dynamic строит её императивно через билдер.

Static: раскладка через возвращаемое значение

Верните список рядов. Каждый элемент это либо кнопка (str или tuple), либо ряд (список кнопок):

from raito import rt


@rt.keyboard.static(inline=False)
def start_markup():
    return [
        "🏀 Throw a ball",           # a row with one button
        ["📄 FAQ", "🏆 Leaderboard"],  # a row with two buttons
    ]

Для inline-клавиатур кнопка это кортеж (text, value). value становится callback_data, если только он не похож на URL (https://, tg://, t.me/...): тогда получится URL-кнопка:

@rt.keyboard.static(inline=True)
def info_markup():
    return [
        ("💬 Support", "support"),                    # callback button
        [("🔒 Privacy", "privacy"), ("📄 TOS", "terms")],  # a two-button row
        ("🌐 Website", "https://example.com"),        # URL button
    ]

Декоратор возвращает ReplyKeyboardMarkup или InlineKeyboardMarkup в зависимости от inline=. Вызовите функцию, чтобы получить разметку:

await message.answer("Menu:", reply_markup=start_markup())

Dynamic: сборка через билдер

Когда раскладка зависит от данных, примите билдер первым аргументом и добавляйте кнопки сами. Любые дополнительные параметры вы передаёте при вызове:

from aiogram.utils.keyboard import InlineKeyboardBuilder
from raito import rt


@rt.keyboard.dynamic(1, 2, inline=True)
def links_markup(builder: InlineKeyboardBuilder, privacy_url: str, tos_url: str):
    builder.button(text="💬 Support", callback_data="support")
    builder.button(text="🔒 Privacy", url=privacy_url)
    builder.button(text="📄 TOS", url=tos_url)


await message.answer(
    "Links:",
    reply_markup=links_markup(privacy_url="...", tos_url="..."),
)

Параметры

Параметр

Значение

inline

Строить inline- (True) или reply- (False) клавиатуру.

*sizes

Схема размеров рядов для adjust (например, 1, 2, 1).

adjust

Автоматически раскладывать кнопки через builder.adjust(*sizes).

repeat

Повторять схему *sizes, пока не покроет все кнопки.

Поставьте adjust=False, чтобы разложить клавиатуру самому. Это удобно, когда форма зависит от условий:

@rt.keyboard.dynamic(adjust=False)
def admin_markup(builder: InlineKeyboardBuilder, show_balance: bool = False):
    sizes = [1]
    builder.button(text="👤 Users", callback_data="users")

    if show_balance:
        builder.button(text="📤 Withdraw", callback_data="withdraw")
        builder.button(text="📥 Deposit", callback_data="deposit")
        sizes.append(2)

    builder.adjust(*sizes)