@eingod

Как сделать корректным вывод при нажатии кнопки в телеграм боте на Python?

Сам код:
# Товары Томск.
@bot.message_handler(regexp="Bыбрать товар")
def handle_menu(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True)
    user_markup.row('Цветы1')
    user_markup.row('Главное меню')
    bot.send_message(message.from_user.id, 'Город: <b>Томск</b> \n\nВыберите товар:', reply_markup=user_markup, parse_mode='html')

# Товары Новосибирск.
@bot.message_handler(regexp="Выбрать товар")
def handle_menu(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True)
    user_markup.row('Цветы2')
    user_markup.row('Главное меню')
    bot.send_message(message.from_user.id, 'Город: <b>Новосибирск</b> \n\nВыберите товар:',
                             reply_markup=user_markup, parse_mode='html')

# Розы Томск
@bot.message_handler(regexp="Цветы1")
def handle_menu(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True)
    user_markup.row('Белые')  #
    user_markup.row('Красные')  #
    user_markup.row('Главное меню')
    bot.send_message(message.from_user.id, 'Город: <b>Томск</b> \n\nТовар: <b>Розы</b>', reply_markup=user_markup,
                         parse_mode='html')

# Розы Новосибирск
@bot.message_handler(regexp="Цветы2")
def handle_menu(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True)
    user_markup.row('Белые Н')
    user_markup.row('Красные Н')
    user_markup.row('Главное меню')
    bot.send_message(message.from_user.id, 'Город: <b>Новосибирск</b> \n\nТовар: <b>Розы</b>', reply_markup=user_markup, parse_mode='html')

# Выбор Цветов в Новосибирске
@bot.message_handler(content_types=['text'])
def handle_text(message):
    if message.text == 'Белые Н':
        user_markup = telebot.types.ReplyKeyboardMarkup(True)
        user_markup.row('Оплатить')
        user_markup.row('Главное меню')
        bot.send_message(message.from_user.id,
                                 'Город: <b>Новосибирск</b> \n\nТовар: <b>Розы</b>\n\n<b>Розы н 5 штук\n\nОплатить</b>',
                                 reply_markup=user_markup, parse_mode='html')


Суть в том, что апи читается не так как хочу и игнорирует условия в #Розы Новосибирск (кнопки кликабельны, но не переходит в #Выбор Цветов в Новосибирске).
Надеюсь поймете меня:D
П.С. Можете сразу подсказать как сделать корректно кнопки. Например через func=lambda, не совсем понимаю как это работает.
  • Вопрос задан
  • 1269 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ranc58
@Ranc58
Backend python developer
Я бы сделал например конечный автомат для отслеживания состояния, и уже исходя из него вызывал бы нужный обработчик сообщений пользователя.

Если совсем-cовсем упрощенно:
@bot.message_handler(func=lambda message: True)
def start_finite_machine(message):
    if STATE_DICT[chat_id] == 'tomsk_supplies':
        handle_tomsk_suplies(message)
    elif STATE_DICT[chat_id] == 'novosibirsk_supplies':
         handle_novosibirsk_supplies(message)
    elif STATE_DICT[chat_id] == 'novosibirsk_roses':
        handle_novosibirsk_roses(message)


и в каждой функции менять этот `STATE_DICT`. Например:
def  handle_novosibirsk_supplies(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True)
    user_markup.row('Цветы2')
    user_markup.row('Главное меню')
    chat_id = message.chat.id
    STATE_DICT[chat_id] = 'novosibirsk_roses'
    bot.send_message(message.from_user.id, 'Город: <b>Новосибирск</b> \n\nВыберите товар:',
                             reply_markup=user_markup, parse_mode='html')
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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