Почему данные не сохраняются в переменную при использовании библиотеки telebot?

Я разрабатываю своего первого бота для обработки зарплаты, но у меня возникли проблемы с тем, как сохранять данные в переменные после обработки нажатия кнопки. Вот мой текущий код:

```python
import telebot
from telebot import types
import time
import works

token = ''

bot = telebot.TeleBot(token)

count_price = 0  # сумма за текущий месяц
count_all = 0    # сумма за все время
user_state = {}

MAIN_MENU = 0  # главное меню
FIRST_WORK_MENU = 1  # меню работ
ADD_WORK_MENU = 2  # меню добавления работ

@bot.message_handler(commands=['start'])
def start(message):
    user_id = message.from_user.id
    user_state[user_id] = MAIN_MENU

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Главное меню")
    btn2 = types.KeyboardButton("ℹ️ Информация")
    btn3 = types.KeyboardButton("ℹ️️ начать подсчет зарплаты")
    btn4 = types.KeyboardButton("ℹ️️ итог за месяц")
    btn5 = types.KeyboardButton("ℹ️ итог за все время")
    markup.add(btn1, btn2, btn3, btn4, btn5)

    bot.send_message(message.chat.id, "Добро пожаловать! Выберите пункт меню:", reply_markup=markup)

@bot.message_handler(content_types=['text'])
def handle_text(message, massage=None, count_all=int(), count_price=int(), count_work=None):
    if message.text == "Главное меню":  # кнопка главного меню
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("Главное меню")
        btn2 = types.KeyboardButton("ℹ️ Информация")
        btn3 = types.KeyboardButton("ℹ️️ начать подсчет зарплаты")
        btn4 = types.KeyboardButton(...)
```

Не могли бы вы помочь мне разобраться, как использовать переменные для сохранения данных после обработки нажатия кнопки?
  • 3 апреля 2025 г. 12:45
Ответы на вопрос 2
Проблема с сохранением данных в переменные в вашем коде связана с тем, что вы пытаетесь передать значения переменных, таких как `count_price` и `count_all`, в функцию обработчика сообщений (`handle_text`) как параметры. Это не сработает, потому что в этом случае функции всегда будут получать значения по умолчанию, как указано в сигнатуре функции.

Вместо этого вам нужно использовать глобальные переменные (или хранить данные в словаре, как вы делаете с `user_state`) и использовать их внутри функций. Давайте исправим ваш код следующим образом:

```python
import telebot
from telebot import types

token = ''  # Вставьте ваш токен

bot = telebot.TeleBot(token)

# Глобальные переменные для хранения суммы
count_price = 0  # сумма за текущий месяц
count_all = 0    # сумма за все время
user_state = {}

MAIN_MENU = 0  # главное меню
FIRST_WORK_MENU = 1  # меню работ
ADD_WORK_MENU = 2  # меню добавления работ

@bot.message_handler(commands=['start'])
def start(message):
    user_id = message.from_user.id
    user_state[user_id] = MAIN_MENU

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Главное меню")
    btn2 = types.KeyboardButton("ℹ️ Информация")
    btn3 = types.KeyboardButton("ℹ️️ начать подсчет зарплаты")
    btn4 = types.KeyboardButton("ℹ️️ итог за месяц")
    btn5 = types.KeyboardButton("ℹ️ итог за все время")
    markup.add(btn1, btn2, btn3, btn4, btn5)

    bot.send_message(message.chat.id, "Добро пожаловать! Выберите пункт меню:", reply_markup=markup)

@bot.message_handler(content_types=['text'])
def handle_text(message):
    global count_price, count_all  # Указываем, что используем глобальные переменные
    
    if message.text == "Главное меню":  # кнопка главного меню
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("Главное меню")
        btn2 = types.KeyboardButton("ℹ️ Информация")
        btn3 = types.KeyboardButton("ℹ️️ начать подсчет зарплаты")
        btn4 = types.KeyboardButton("ℹ️️ итог за месяц")
        btn5 = types.KeyboardButton("ℹ️ итог за все время")
        markup.add(btn1, btn2, btn3, btn4, btn5)
        
        bot.send_message(message.chat.id, "Вы вернулись в главное меню.", reply_markup=markup)
    
    elif message.text == "ℹ️️ начать подсчет зарплаты":
        count_price += 100  # Зап пример, увеличить count_price на 100
        bot.send_message(message.chat.id, f"Начат подсчет зарплаты. Текущая сумма: {count_price}")

    elif message.text == "ℹ️️ итог за месяц":
        bot.send_message(message.chat.id, f"Итог за месяц: {count_price}")

    elif message.text == "ℹ️ итог за все время":
        bot.send_message(message.chat.id, f"Итог за все время: {count_all}")

# Добавьте другие условия для обработки других кнопок по аналогии
    
bot.polling(none_stop=True)
```

### Объяснение изменений:
1. **Использование глобальных переменных:** Мы добавили `global count_price, count_all` в начале функции `handle_text`, чтобы указать, что мы хотим работать с глобальными переменными, а не создаем новые локальные переменные.

2. **Условные ветки:** Мы добавили функциональность для нескольких кнопок, обрабатывая текстовые команды, чтобы вы могли видеть, как изменяются `count_price` и `count_all` при нажатии кнопок.

Теперь при нажатии кнопки соответствующие суммы будут обновляться, и вы сможете их отображать в чате. Вы можете продолжать расширять логику обработки, добавляя остальные кнопки и их действия.
По-хорошему, вам надо озадачиться изучением такой вещи, как БД (база данных). Но если уж очень лень, то здесь как минимум нужен словарь. 

Что-то типа этого:
Похожие вопросы