Как создать многоуровневое меню для телеграмм бота с использованием библиотеки telebot?

Как можно оптимизировать код многоуровневого меню каталога кроссовок, чтобы избежать большого количества условий if в одной функции? Возможно, стоит выделить каждое меню в отдельную функцию, но как правильно обращаться к переменной call из различных функций и сделать ее глобальной?
  • 16 апреля 2024 г. 17:30
Ответы на вопрос 2
Для создания многоуровневого меню для телеграмм бота с использованием библиотеки telebot, можно использовать следующий подход:

1. Создайте основное меню бота, например, главное меню с несколькими кнопками.
2. При нажатии на каждую кнопку основного меню, запускайте новое меню с дополнительными кнопками.
3. Добавьте обработчики для каждой кнопки в соответствующем меню.

Пример кода для создания многоуровневого меню в боте с использованием библиотеки telebot:

```python
import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup()
    markup.row(types.KeyboardButton('Каталог кроссовок'))
    bot.send_message(message.chat.id, "Выберите действие:", reply_markup=markup)

@bot.message_handler(func=lambda message: True)
def handle_messages(message):
    if message.text == 'Каталог кроссовок':
        shoes_menu(message)

def shoes_menu(message):
    markup = types.ReplyKeyboardMarkup()
    markup.row(types.KeyboardButton('Adidas'))
    markup.row(types.KeyboardButton('Nike'))
    bot.send_message(message.chat.id, "Выберите бренд кроссовок:", reply_markup=markup)

bot.polling()
```

Чтобы оптимизировать код многоуровневого меню каталога кроссовок и избежать большого количества условий if в одной функции, можно разделить каждое меню в отдельные функции. Для доступа к переменной `call` из различных функций и сделать ее глобальной, можно передавать `call` как аргумент в каждую функцию, где она используется.

Пример оптимизированного кода:

```python
import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(commands=['start'])
def start(message):
    main_menu(message.chat.id)

def main_menu(chat_id):
    markup = types.ReplyKeyboardMarkup()
    markup.row(types.KeyboardButton('Каталог кроссовок'))
    bot.send_message(chat_id, "Выберите действие:", reply_markup=markup)

@bot.message_handler(func=lambda message: True)
def handle_messages(message):
    if message.text == 'Каталог кроссовок':
        shoes_menu(message.chat.id)

def shoes_menu(chat_id):
    markup = types.ReplyKeyboardMarkup()
    markup.row(types.KeyboardButton('Adidas'))
    markup.row(types.KeyboardButton('Nike'))
    bot.send_message(chat_id, "Выберите бренд кроссовок:", reply_markup=markup)

bot.polling()
```

Таким образом, выделение каждого меню в отдельную функцию поможет сделать код более читаемым и управляемым, а передача `chat_id` как аргумент в функции позволит избежать использования глобальной переменной.
Ну первое, что я замечу: в коде только call_start_menu() помечена как обработчик событий от кнопок, потому что только перед ней стоит декоратор callback_query_handler. 
Советую ознакомиться с документацией и примерами, чтобы понять, как регистрируются обработчики.
А заодно (поскольку это будет ваш следующий вопрос) понять, что такое func= и для чего оно нужно .
Похожие вопросы