Страницы в Aiogram
Подскажите как реализовать страницы с перелистыванием вперед и назад как показано на фото. 
Покажите пример для двух страниц, пожалуйста!
@dp.callback_query_handler(text='fajr_lesson')
async def fajr_callback(message: types.Message):
await bot.delete_message(message.from_user.id, message.message.message_id)
await bot.send_photo(message.from_user.id, 'https://azan.kz/namaz-data/img/rijaal/niet.png',
caption='<b>1. Ният (намерение):</b> \n\nЯ намереваюсь совершить 2 ракаата утреннего фаджр '
'намаза ради довольства Аллаха',
parse_mode='HTML', reply_markup=nav.btn_nb)
if callback.message == 'next_step':
await bot.send_photo(message.from_user.id, 'https://azan.kz/namaz-data/img/rijaal/qyam-qyraat.png',
caption='<b>Такбир:</b> \n\nПовернувшись в направлении киблы, мусульманин поднимает ладони '
'до уровня ушей и произносит первый такбир: \n\n<i>Аллаху Акбар!</i>',
parse_mode='HTML', reply_markup=nav.btn_nb)
Ответы (1 шт):
Автор решения: tomato-magnet-regulato
→ Ссылка
async def cmd_pages(message: types.Message):
await message.answer('pages of 1 - default', reply_markup=pages_keyboard)
async def first_p(call:types.CallbackQuery):
await call.message.edit_text('pages of 1 - default', reply_markup=pages_keyboard)
async def second_p(call:types.CallbackQuery):
await call.message.edit_text('pages of 2 - second', reply_markup=pages_keyboard)
async def three_p(call:types.CallbackQuery):
await call.message.edit_text('pages of 3 - second', reply_markup=pages_keyboard)
def register_handlers_common(dp: Dispatcher):
dp.register_message_handler(cmd_pages, commands="pages")
dp.register_callback_query_handler(first_p, text = 'one')
dp.register_callback_query_handler(second_p, text = 'two')
dp.register_callback_query_handler(three_p, text = 'three')
Buttons:
pages = [
types.InlineKeyboardButton('1', callback_data='one'),
types.InlineKeyboardButton('2', callback_data='two'),
types.InlineKeyboardButton('3', callback_data='three')
]
pages_keyboard = types.InlineKeyboardMarkup().add(
pages[0], pages[1], pages[2]
)
Возможно есть более элегантное решение, но как пример подойдет.
instruction_caption = (
'step 1',
'step 2',
'step 3',
'step 4',
'step 5',
'step 6',
'step 7',
'step 8'
)
#При изменении сообщения мы каждый раз будем создавать новые кнопки с обновленным callback_data
def btn_nextback(page):
markup = types.InlineKeyboardMarkup()
next = types.InlineKeyboardButton('➡️', callback_data=f'pages_{page+1}')
back = types.InlineKeyboardButton('⬅️', callback_data=f'pages_{page-1}')
return markup.add(
back, next
)
#Команда - /pages стартует с первого шага и callback_data = {pages_0, pages_1}
async def cmd_pages(message: types.Message):
await message.answer(instruction_caption[0], reply_markup=btn_nextback(1))
#Если callback ловит данные с pages_ мы сплитуем и достаем индекс кнопки что = индексу шага.
async def next_(call:types.CallbackQuery):
if(call.data.startswith('pages_')):
page = int(call.data.split('_')[1])
await call.message.edit_text(instruction_caption[page-1], reply_markup=btn_nextback(page))
Вам остается следуя этому примеру, обработать переход от последнего к первому шагу, и от первого шага к последнему, то есть закрутить слайдер. Удачи.

