@kaveri571

Реализация многоуровневого inline меню Telegram?

Всем привет! Хочу реализовать простенькое многоуровневое меню. В моей программе есть два уровня: 1 уровень показать меню, 2 уровень перейти на кнопки из первого меню и вернуться назад обратно. В моей реализации (код ниже), кнопка назад отрабатывает свою функцию, но как ее связать с 1 уровнем, чтобы это сообщение редактировалось, как объявить этот callback?! И как потом можно лучше масштабировать данный код для 3, 4 уровненных инлайн меню?

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await list_categories(message)

async def list_categories(message: types.Message):
    text = f'Добрый день!\n\n' \
           f'Мой номер:\n' \
           f'+7-000-000-00-00'

    markup = InlineKeyboardMarkup(row_width=2)
    markup.insert(InlineKeyboardButton(text='Прайс', callback_data='price'))
    markup.insert(InlineKeyboardButton(text='Акции', url="https://example.com"))
    await message.answer(text=text, reply_markup=markup)


@dp.callback_query_handler(lambda callback: True)
async def callback_inline(callback_query: types.CallbackQuery):
    if callback_query.data == 'main_menu':
        await callback_query.message.edit_text(text='Вы вернулись')

    elif callback_query.data == 'price':
        markup = InlineKeyboardMarkup()
        markup.insert(InlineKeyboardButton(text='Назад', callback_data='main_menu'))
        await callback_query.message.answer(text='Вы в категории price', reply_markup=markup)
        await callback_query.answer()
  • Вопрос задан
  • 511 просмотров
Решения вопроса 1
@kaveri571 Автор вопроса
Отвечу сам на свой вопрос
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await list_categories(message)


async def list_categories(message: Union[types.CallbackQuery, types.Message], **kwargs):
    markup = types.InlineKeyboardMarkup(row_width=2)
    markup.insert(types.InlineKeyboardButton(text='Прайс', callback_data='price'))

    text = f'Добрый день!\n\n' \
           f'Мой номер:\n' \
           f'+7-996-000-00-00'

    if isinstance(message, types.Message):
        await message.answer(text=text, reply_markup=markup)

    elif isinstance(message, types.CallbackQuery):
        call = message
        await call.message.edit_text(text=text, reply_markup=markup)


@dp.callback_query_handler(text='back')
async def test(callback: types.CallbackQuery):
    await callback.answer()
    await list_categories(callback)


@dp.callback_query_handler(text='price')
async def inline_kb_answer_callback_handler(callback: types.CallbackQuery):
    await callback.answer()
    markup = types.InlineKeyboardMarkup(row_width=2)
    markup.insert(types.InlineKeyboardButton(text='Назад', callback_data='back'))
    text = 'Тут прайс'
    await callback.message.edit_text(text=text, reply_markup=markup)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы