Страницы в 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))

введите сюда описание изображения

Вам остается следуя этому примеру, обработать переход от последнего к первому шагу, и от первого шага к последнему, то есть закрутить слайдер. Удачи.

→ Ссылка