Как правильно описать действие «Вернуться назад» в телеграм боте на Python?

Здравствуйте!
Подскажите, как правильно сделать. Есть много меню с кнопкой "Вернуться назад" , как сделать так, чтобы только при определенном(из многих) меню с кнопкой "Вернуться назад" возвращалась к определенному(из многих) меню.
@bot.message_handler(commands=['start'])

def handle_text1(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
    user_markup.row("Каталог", "Акция")
    user_markup.row("Корзина", "Доставка")
    bot.send_message(message.from_user.id, "Здравствуй, {0}!".format(message.from_user.first_name),reply_markup=user_markup)
    bot.send_message(message.from_user.id, "Выберете раздел", reply_markup=user_markup)

Class Keyboard   
    def __init__(self, bot):
        self.bot = bot

    def main_menu(self,message):
        user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
        user_markup.row("Каталог", "Акция")
        user_markup.row("Корзина", "Доставка")
        user_markup.row("/start")
        self.bot.send_message(message.from_user.id, "Выберете раздел", reply_markup=user_markup)

    def katalog_menu(self, message):
        catdog_markup = telebot.types.ReplyKeyboardMarkup(True, False)
        catdog_markup.row("Корм для собак", "Корм для кошек")
        catdog_markup.row("Вернуться назад")
        catdog_markup.row("Главная")
        self.bot.send_message(message.from_user.id, "Выберете раздел", reply_markup=catdog_markup)


    def katalog_dog(self, message):
        dog_markup = telebot.types.ReplyKeyboardMarkup(True, False)
        dog_markup.row("Для щенков и юниоров")
        dog_markup.row("Для взрослых", "Для пожилых")
        dog_markup.row("Вернуться назад")
        dog_markup.row("Главная")
        self.bot.send_message(message.from_user.id, "Выберете раздел", reply_markup=dog_markup)

@bot.message_handler(func=lambda mess: 'Вернуться назад' == mess.text, content_types=['text'])
def handle_text(message):
    user_position = Keyboard
    if user_position(keyboard.katalog_menu(message)):
        keyboard.main_menu(message)
    elif user_position(keyboard.katalog_dog(message)): 
            keyboard.katalog_menu(message)
  • Вопрос задан
  • 9754 просмотра
Пригласить эксперта
Ответы на вопрос 5
@AlmazKayum
Я в таких случаях делаю две разные кнопки, например: "Вернуться назад", "Назад".
Вернуться назад ведет в главное меню.
Назад в подменю.

Но на вопрос подписался, действительно интересно, как грамотно делать такие вещи, если иерархия большая будет, то изысканнее сделать так, как у вас планируется.
Ответ написан
Комментировать
odilbukh
@odilbukh
Новичок но настойчивый
Мне тоже интересно!
Ответ написан
Комментировать
@CheXnik
я это реализую вот так:
если надо вернуться в главное меню, тогда:
if 'Назад' in message.text:
    await message.answer("Ты вернулся в главное меню", reply_markup=kb.markup_home)

подменю:
Когда человек находится в в каком-то состоянии, то я проверяю что он прислал, если "Назад", тогда переношу его в прошлое состояние, и вывожу нужную клавиатуру. Вот код:
@dp.message_handler(state=Update_account.UpdateFirstName)
async def answer_first_name(message: types.Message, state: FSMContext):
    text = message.text
    if text == "Назад":
        await message.answer('Ты вернулся назад', reply_markup=kb.update_account)
        await Update_account.Update.set()
    else:
        <тут действие если не нажата кнопка "Назад">
Ответ написан
Комментировать
@AlexMine
Учусь
Если я правильно понял ваш вопрос, то решение в том, что нужно хранить состояние(в бд например) на каком этапе находится пользователь и при нажатии кнопки 'Назад' просто переключать на предыдущий пункт.
Ответ написан
Комментировать
@Tahircik
надеюсь не будите кидаться палками ибо это тот метод каким я выкручиваюсь . в общем у меня каждое сообщение это объект , в котором есть своим кнопки и так далее , кнопки я также преопредилил из модуля pytelegrambotapi , так что бы каждая кнопка имела свои объект сообщения , и естественно реализовал конечный автомат , что позволило мне , создать словарь у которого ключ это позиция из автомата , в котором находиться обькт сообщения и кнопок а также ключ на предыдущее сообщение .
Это позволяет реализовать кнопку назад таким образом : при нажатии кнопки , оно смотрит в каком положении автомат , находит это в словаре и смотрит какое пред идущее сообщение после чего вызывает его , вот и всё .
Надеюсь я помог комуто , не ругайтесь за граматику :)
link = {
    1:{
        'message' : MLanguage_1.Message_language ,
        'prev' : None ,
        'rus' : BRus.Rus ,
        'eng' : BEng.Eng ,
    } ,

    2:{
        'message' : MAgreement_2.Message_Agreement ,
        'prev' : None,
        'agreement' : BAgreement.Agreement ,
        'agree' : BAgree.Agree ,
        'ignore' : BIgnore.Ignore
    } ,

    -2:{
        'message' : MIgnore__2.Message_Ignor ,
        'prev' : 2 ,
        'back' : BReturn.Return,
    } ,

    3:{
        'message' : MMain.Message_Main_Menu ,
        'prev' : None ,
        'trading' : BTrading.Trading ,
        'panic' : BPanic.Panic ,
        'settings' : BSettings.Settings ,
        'help' : BHelp.Help ,
        'referal' : BReferal.Referal ,
        'cabinet' : BCabinet.Cabinet
    } ,

    7:{
        'message' : MHelp.Message_Help, #сам обьект сообшения
        'prev' : 3 , #значение предидушкго сообщения
        # кнопки
        'faq' : BFAQ.FAQ ,
        'service' : BService.Service ,
        'back' : BBack.Back
    }
# при нажатии кнопки назад
bot.send_message(chat_id=self.data.from_user.id , 
message=link[link[self.status]['prev']]['message']())


вот сам словарь :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы