Конечные автоматы telebot register_next_step_handler?

Суть вопроса такова - почему функция register_next_step_handler не завершается после многократного вызывания , а продолжается вызываться с последующими командами бота.
Привожу пример в виде скришотов:
nPGtj5eG2T8.jpg
Когда вызываю одну команду много раз она не завершается и начинается дублироваться со следующими командами
eP00ickaqKY.jpg
U3UZ_hqSylQ.jpg
И так продолжается со всеми пунктами меню
tMPoRsU95PI.jpg
Вот исходный код который у меня получился
import telebot
import user
import json
from telebot import apihelper
from telebot.types import Message
from telebot import types
bot = telebot.TeleBot(config.token)
apihelper.proxy = {'https': 'xxx'}
def keyboard_menu():
    print("вызов keyboard_menu")
    keyboard_menu = telebot.types.ReplyKeyboardMarkup(True)
    keyboard_menu.row('Город')
    keyboard_menu.row('Способы оплаты')
    return keyboard_menu

def keyboard_sity():
    print("вызов keyboard_sity")
    keyboard_menu = telebot.types.ReplyKeyboardMarkup(True)
    keyboard_menu.row('Главное меню')
    return keyboard_menu

def send_text(message):
    if message.text == 'Город':
        bot.send_message(message.chat.id, 'Выберите город из ниже предоставленных:',reply_markup=keyboard_sity())
        bot.register_next_step_handler(message, sity)
    else:
        bot.send_message(message.chat.id, '*Выберите один из пунктов меню*',parse_mode="Markdown",reply_markup=keyboard_menu())
        bot.register_next_step_handler(message, send_text)
def sity(message):
    if message.text.lower() == 'главное меню':
        bot.send_message(message.chat.id, '*Выберите один из пунктов меню*' ,reply_markup=keyboard_menu() , parse_mode="Markdown")
        bot.register_next_step_handler(message,send_text)
    else:
        bot.send_message(message.chat.id,'такого города не знаем =(')
        bot.register_next_step_handler(message, sity)

@bot.message_handler(commands=['start'])
def start_message(message):
    if message.text == '/start':
        start_bot = f'*Приветствуем {message.chat.username}*\n\n*Выберите один из пунктов меню*'
        bot.send_message(message.chat.id, start_bot ,reply_markup=keyboard_menu(),parse_mode="Markdown")
    
@bot.message_handler(content_types=['text'])
def text(message):
    bot.send_message(message.chat.id,'*Нажмите /start*',reply_markup=telebot.types.ReplyKeyboardRemove(),parse_mode="Markdown")
    bot.register_next_step_handler(message, send_text)


while True:
    try:
        bot.polling(none_stop=True,interval=3)
    except Exception as e:
        print(e)
        time.sleep(15)
  • Вопрос задан
  • 3568 просмотров
Решения вопроса 1
@levap12 Автор вопроса
Проблему саму не удалось решить, но мне помогло это:
types.ReplyKeyboardMarkup(one_time_keyboard=True,
                                       resize_keyboard=True)

one_time_keyboard=True
Клавиатура сразу убирается когда пользователь выбрал нужный пункт меню. Благодаря этому пользователь не сможет много кратно и быстро переключаться по меню.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
JackSurfer
@JackSurfer
Разместите функции в правильной последовательности.
Ответ написан
@test293
Привет!
Рекомендую переходить на стейты.
https://github.com/eternnoir/pyTelegramBotAPI/blob...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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