Inline Keyboards¶
Inline keyboards are the most powerful feature of PyKeyboard, providing rich interactive experiences for your Telegram bots.
Basic Usage¶
from pykeyboard import InlineKeyboard, InlineButton
# Create keyboard
keyboard = InlineKeyboard()
# Add buttons
keyboard.add(
InlineButton("Option 1", "choice:1"),
InlineButton("Option 2", "choice:2"),
InlineButton("Cancel", "action:cancel")
)
# Send to user
await message.reply_text("Choose an option:", reply_markup=keyboard)
Button Types¶
Text Buttons¶
URL Buttons¶
Web App Buttons¶
from pyrogram.types import WebAppInfo
button = InlineButton("Open Web App", web_app=WebAppInfo(url="https://myapp.com"))
Login Buttons¶
from pyrogram.types import LoginUrl
button = InlineButton("Login", login_url=LoginUrl(url="https://example.com/login"))
Layout Control¶
Row Width¶
# 2 buttons per row
keyboard = InlineKeyboard(row_width=2)
keyboard.add("A", "B", "C", "D") # Creates 2 rows: [A,B], [C,D]
Manual Rows¶
keyboard = InlineKeyboard()
keyboard.row("Button 1", "Button 2") # First row
keyboard.row("Button 3") # Second row
keyboard.add("Button 4", "Button 5") # Third row (auto-layout)
Advanced Features¶
Pagination¶
keyboard = InlineKeyboard()
keyboard.paginate(
count_pages=25,
current_page=12,
callback_pattern="page:{number}"
)
# Creates: « 1 ‹ 11 · 12 · 13 › 25 »
Different Page Counts¶
3 Pages:
5 Pages:
9 Pages:
100 Pages:
150 Pages with Additional Buttons:
keyboard = InlineKeyboard()
keyboard.paginate(150, 75, 'page:{number}')
keyboard.row(
InlineButton('🔙 Back', 'action:back'),
InlineButton('❌ Close', 'action:close')
)
Language Selection¶
keyboard = InlineKeyboard()
keyboard.languages(
callback_pattern="lang:{locale}",
locales=["en_US", "es_ES", "fr_FR", "de_DE"],
row_width=2
)
Builder Pattern¶
from pykeyboard import KeyboardBuilder
builder = KeyboardBuilder(InlineKeyboard())
keyboard = (builder
.add_button("Yes", "yes")
.add_button("No", "no")
.add_row("Maybe", "Cancel")
.build())
Best Practices¶
Callback Data Patterns¶
# Good: Structured callback data
InlineButton("Edit", "action:edit:item:123")
# Bad: Unstructured data
InlineButton("Edit", "edit_item_123")
Error Handling¶
from pykeyboard import PaginationUnchangedError
try:
await callback_query.edit_message_text("Updated!")
except PaginationUnchangedError as e:
# Handle MessageNotModifiedError, etc.
await callback_query.answer("Already updated")
Common Patterns¶
Confirmation Dialog¶
from pykeyboard import KeyboardFactory
keyboard = KeyboardFactory.create_confirmation_keyboard(
yes_text="✅ Confirm",
no_text="❌ Cancel",
callback_pattern="confirm:{action}"
)
Menu Navigation¶
def create_menu(items, callback_prefix):
keyboard = InlineKeyboard(row_width=2)
for item in items:
keyboard.add(InlineButton(item['name'], f"{callback_prefix}:{item['id']}"))
return keyboard
Dynamic Updates¶
@app.on_callback_query(filters.regex(r"counter:(\w+)"))
async def handle_counter(client, callback_query):
action = callback_query.matches[0].group(1)
# Update counter in database
new_count = update_counter(action)
# Update keyboard with new data
keyboard = create_counter_keyboard(new_count)
await callback_query.edit_message_reply_markup(keyboard)