@puffffik
Молодой человек

Как в telebot циклом for заполнить словарь?

Не могу разобраться. Нужно создать словарь и записывать в него значения отправленные из телеги
@bot.message_handler(content_types=["text"])
def vvod_jitel(message):
    for i in (1, int(jit_dan)):
                bot.send_message(message.from_user.id, "Сколько заработал кубков житель " + str(i) + ": ")
                bot.register_next_step_handler(message, a)
def a(message):
        global jitelis
        jitelis = {}
        if message.text.isdigit():
            for i in range(1, int(jit_dan)):
                jitelis["Житель " + str(i)] = message.text

Вместо того, чтоб он отправил жителя 1 и ждал ответа, он отправляет сразу всех жителей как на скрине и ждёт ответа. При чем я так понял он записывает только первого жителя. Готов к другим предложениям не через цикл фор как записать данные для жителей, чтоб потом использовать их в другом месте
624aad93d132e570802134.jpeg
  • Вопрос задан
  • 602 просмотра
Решения вопроса 2
@twistfire92
Python backend developer
Поиграйтесь с этим кодом
import telebot

bot = telebot.TeleBot(token='XXXXXXXXXXXXXXXXXXXX')


@bot.message_handler(content_types=["text"])
def get_text_messages(message):
    if message.text == "Привет":
        bot.send_message(message.from_user.id, "Начнем")
        start(message)
    elif message.text == "/help":
        bot.send_message(message.from_user.id, "Напиши Привет")
    else:
        bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")


# Точка старта.
def start(message):
    # Инициализируем наш словарь, который будем прокидывать в каждую функцию
    data = {}
    mes = bot.send_message(message.from_user.id, "Введите количество бриллиантов:")
    bot.register_next_step_handler(mes, vvod_brill, data)


# Получаем бриллианты
def vvod_brill(message, data):
    if not message.text.isdigit():
        bot.send_message(message.from_user.id, "Нужно ввести число")
        bot.register_next_step_handler(message, vvod_brill, data)
    else:
        brill_count = int(message.text)
        data['brill_count'] = brill_count
        bot.send_message(message.from_user.id, f"Получено бриллиантов: {brill_count}")
        bot.send_message(message.from_user.id, "Введите количество рубинов:")
        bot.register_next_step_handler(message, vvod_rub, data)


# Получаем рубины
def vvod_rub(message, data):
    if not message.text.isdigit():
        bot.send_message(message.from_user.id, "Нужно ввести число")
        bot.register_next_step_handler(message, vvod_rub, data)
    else:
        rub_count = int(message.text)
        data['rub_count'] = rub_count
        bot.send_message(message.from_user.id, f"Получено рубинов: {rub_count}")
        bot.send_message(message.from_user.id, "Введите количество жителей:")
        bot.register_next_step_handler(message, vvod_jit, data)


# Получаем количество жителей
def vvod_jit(message, data):
    if not message.text.isdigit():
        bot.send_message(message.from_user.id, "Нужно ввести число")
        bot.register_next_step_handler(message, vvod_jit, data)
    else:
        jit_count = int(message.text)
        data['jit_count'] = jit_count
        bot.send_message(message.from_user.id, f"Всего жителей: {jit_count}")
        counter = 1
        bot.send_message(message.from_user.id, f"Сколько заработал кубков житель {counter}?")
        bot.register_next_step_handler(message, vvod_cubok, data, counter)


# Получаем количество кубков для каждого
def vvod_cubok(message, data, counter):
    if not message.text.isdigit():
        bot.send_message(message.from_user.id, "Нужно ввести число")
        bot.register_next_step_handler(message, vvod_cubok, data, counter)
    else:
        cubok_count = int(message.text)
        data[f'jit_{counter}_cubok'] = cubok_count
        bot.send_message(message.from_user.id, f"Житель {counter} заработал {cubok_count} кубков")
        counter += 1
        if counter <= data['jit_count']:
            bot.send_message(message.from_user.id, f"Сколько заработал кубков житель {counter}?")
            bot.register_next_step_handler(message, vvod_cubok, data, counter)
        else:
            bot.send_message(message.from_user.id, 'А теперь посмотрим что у нас вышло')
            bot.send_message(message.from_user.id, f'{data}')


if __name__ == '__main__':
    bot.polling()

Я тут набросал основной алгоритм без логики. Я думаю по аналогии справитесь с остальным. Запустите, посмотрите что выводит в конце.
Вам надо будет доработать свою логику и добавить обработку когда количество жителей 0. Сейчас про одного все равно спрашивается.
Ответ написан
@MaxKra1985
разработчик java, python
Объявите глобальную переменную
stateGlobal: int = 0

После ввода количества жителей приравняйте её к 1.

А затем используйте в обработчиках. Примерно так:
@bot.message_handler(content_types=["text"])
def vvod_jitel(message):
    global stateGlobal
    if stateGlobal > 0 and stateGlobal <= jit_dan:
                msgSend = bot.send_message(message.from_user.id, "Сколько заработал кубков житель " + str(stateGlobal) + ": ")
                bot.register_next_step_handler(msgSend, a)
    else:
        print("Запрос данных по жителям завершен")

def a(message):
        global jitelis
        global stateGlobal
        if message.text.isdigit():
                jitelis["Житель " + str(stateGlobal)] = message.text
        stateGlobal += 1
        vvod_jitel(message)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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