Можно ли в таком коде сделать автоматическое удаление предыдущего меню?

Рейтинг: 1Ответов: 1Опубликовано: 07.06.2023

На работе попросили сделать бота, а я в этом совсем ничего не понимаю. Из разного кода на просторах интернета собрал своего монстра Франклинштейна и он работает. Как сделать так чтобы каждый раз когда пользователь нажимает на кнопку предыдущее меню исчезало, а на его месте возникало новое? Я и кнопки "назад" добавил. Вот мой код:

@bot.message_handler(commands=["start"])
def inline(massege):
    mainmenu = types.InlineKeyboardMarkup()
    catalog = types.InlineKeyboardButton(text="Каталог", callback_data="Catalog")
    help = types.InlineKeyboardButton(text="Поддержка", callback_data="help")
    mainmenu.add(catalog, help)
    bot.send_message(massege.chat.id, "ВЫБЕРИТЕ КНОПКУ", reply_markup=mainmenu)



@bot.callback_query_handler(func=lambda a:True)
def inline_a(a):
    if a.data == 'Catalog' or a.data == "menucatalog":            #!
        menucatalog = types.InlineKeyboardMarkup()
        but1 = types.InlineKeyboardButton(text="Позвонить на горячую линию", callback_data="but1")
        but2 = types.InlineKeyboardButton("Перейти на сайт", url='https://vk.com')
        but3 = types.InlineKeyboardButton(text="Позвонить психологу", callback_data="but3")
        but4 = types.InlineKeyboardButton(text="Меры поддержки семей", callback_data="but4")
        but5 = types.InlineKeyboardButton(text="Задать вопрос", callback_data="but5")
        but6 = types.InlineKeyboardButton(text="Отправить предложение", callback_data="but6")
        but7 = types.InlineKeyboardButton(text="Видеосоветы психолога", callback_data="but7")
        backinmainmenuforcatalog = types.InlineKeyboardButton(text="Назад", callback_data="backinmainmenu")
        menucatalog.add(but1)
        menucatalog.add(but2)
        menucatalog.add(but3)
        menucatalog.add(but4)
        menucatalog.add(but5)
        menucatalog.add(but6)
        menucatalog.add(but7)
        menucatalog.add(backinmainmenuforcatalog)
        bot.send_message(a.message.chat.id, 'Каталог', reply_markup=menucatalog)

    elif a.data =='but1':
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id, '8945', reply_markup=kurs1)

    elif a.data =='but2':
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id, 'vk.com', reply_markup=kurs1)

    elif a.data =='but3':
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id, 'Вик1', reply_markup=kurs1)

    elif a.data == 'but4':
        kurs1 = types.InlineKeyboardMarkup()
        
                                              callback_data="paykurs10")
        paykurs11 = types.InlineKeyboardButton(text="Юридическая консультация",
                                              callback_data="paykurs11")
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(paykurs1)
        kurs1.add(backincatalog)



        bot.send_message(a.message.chat.id, 'Курс 1', reply_markup=kurs1)
    elif a.data == "paykurs1":
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="but4")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id,
                         'Ежемесячная выплата в РФ»',
                         reply_markup=kurs1)
    elif a.data == "paykurs2":
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="but4")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id,
                         'Единовременная материальная помощь»',
                         reply_markup=kurs1)
    elif a.data == "paykurs3":
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="but4")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id,
                         'Единовременная материальная помощь»',
                         reply_markup=kurs1)
    elif a.data == "paykurs4":
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="but4")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id,
                         'Освобождение от начисления пеней',
                         reply_markup=kurs1)
    elif a.data == "paykurs5":
        kurs1 = types.InlineKeyboardMarkup()
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="but4")
        kurs1.add(backincatalog)
        bot.send_message(a.message.chat.id,
                         'Возможность на льготных (безвозмездных) условиях посещать учреждения культуры',
                         reply_markup=kurs1)
    elif a.data == "paykurs6":
        



    elif a.data == 'but5':
        kurs1 = types.InlineKeyboardMarkup()
        aboutkurs1 = types.InlineKeyboardButton(text="О курсе", callback_data="aboutkurs1")
        paykurs1 = types.InlineKeyboardButton(text="Оплата", callback_data="paykurs1")
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(aboutkurs1, paykurs1, backincatalog)
        bot.send_message(a.message.chat.id, 'Курс 1', reply_markup=kurs1)




    elif a.data == 'but6':
        kurs1 = types.InlineKeyboardMarkup()
        aboutkurs1 = types.InlineKeyboardButton(text="О курсе", callback_data="aboutkurs1")
        paykurs1 = types.InlineKeyboardButton(text="Оплата", callback_data="paykurs1")
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(aboutkurs1, paykurs1, backincatalog)
        bot.send_message(a.message.chat.id, 'Курс 1', reply_markup=kurs1)

    elif a.data == 'but7':
        kurs1 = types.InlineKeyboardMarkup()
        aboutkurs1 = types.InlineKeyboardButton(text="О курсе", callback_data="aboutkurs1")
        paykurs1 = types.InlineKeyboardButton(text="Оплата", callback_data="paykurs1")
        backincatalog = types.InlineKeyboardButton(text="Назад", callback_data="menucatalog")
        kurs1.add(aboutkurs1, paykurs1, backincatalog)
        bot.send_message(a.message.chat.id, 'Курс 1', reply_markup=kurs1)

    elif a.data == 'help':
        menuhelp = types.InlineKeyboardMarkup()
        helper = types.InlineKeyboardButton(text="Связь с нами", callback_data="helper")
        backinmainmenu = types.InlineKeyboardButton(text="Назад", callback_data="backinmainmenu")
        menuhelp.add(helper, backinmainmenu)
        bot.send_message(a.message.chat.id, 'Выберите действие', reply_markup=menuhelp)

    elif a.data == "helper":
        bot.send_message(a.message.chat.id, 'Это кнопка 2')







    elif a.data == 'backinmainmenu':
        return inline(a.message)

    #elif a.data == 'menucatalog':                     #!
    #   return inline(a.message)                       #!

    elif a.data == 'backinmainmenu':
        return inline(a.message)

bot.polling(none_stop=True, interval=0)```

Ответы

▲ 0

Если вы хотите изменять только клавиатуру, используйте вместо send_message метод edit_message_reply_markup:

edit_message_reply_markup(
    self, chat_id: Optional[Union[int, str]]=None, 
    message_id: Optional[int]=None,
    inline_message_id: Optional[str]=None, 
    reply_markup: Optional[types.InlineKeyboardMarkup]=None)

Но, судя по приведённому коду, вы меняете и текст сообщения. Тогда вам нужен метод edit_message_text, где заодно можно поменять и reply_markup.

Вот исправленный кусочек вашего кода:

    elif a.data =='but1':
        kurs1 = types.InlineKeyboardMarkup()

        backincatalog = types.InlineKeyboardButton(
            text="Назад", 
            callback_data="menucatalog")
        kurs1.add(backincatalog)
    
        bot.edit_message_text(
            chat_id=a.message.chat.id,
            message_id=a.message.id,
            text='8945', 
            reply_markup=kurs1)

Если у вас много клавиатур, их можно упростить и структурировать с помощью библиотеки Keyboa. Например, заменить этот код:

    kurs1 = types.InlineKeyboardMarkup()

    backincatalog = types.InlineKeyboardButton(
        text="Назад", 
        callback_data="menucatalog")
    kurs1.add(backincatalog)

всего одной строкой:

    kurs1 = Keyboa(items=[("Назад", "menucatalog"), ])()