⌨️ Клавиатуры¶
В 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- ( |
|
Схема размеров рядов для |
|
Автоматически раскладывать кнопки через |
|
Повторять схему |
Поставьте 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)