@azama2t

Работа с register_next_step_handler()?

Добрый день. Делал годовой школьный проект за 9 класс. Суть проекта - тг бот для моей школы.
Вот полный код, ниже опишу в чем проблема
import telebot
from telebot import types

# Введите токен вашего бота в кавычки
TOKEN = 'токен'
admins = [1234556789]
# Создайте объект бота
bot = telebot.TeleBot(TOKEN)

olimpiad_text = ["ghbdtn"]
olimpiad_test_text =[]


# Обработчик команды /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
    # Создаем объект клавиатуры с одной кнопкой
    keyboard = types.InlineKeyboardMarkup()
    important_events_button = types.InlineKeyboardButton(text="Важные события", callback_data="important_events")
    doska = types.InlineKeyboardButton(text="Доска достижений", callback_data="doska")
    admin_panel = types.InlineKeyboardButton(text="ADMIN PANEL", callback_data="admin_panel")
    keyboard.add(important_events_button,doska)

    if message.chat.id in admins:
        keyboard.add(admin_panel)

    # Отправляем приветственное сообщение с клавиатурой
    bot.reply_to(message, "Привет! " + message.from_user.first_name + ", Это бот ИША", reply_markup=keyboard)


# Обработчик нажатия на кнопку "Важные события"
@bot.callback_query_handler(func=lambda call: call.data == "important_events")
def important_events_handler(call):
    # Создаем объект клавиатуры с 4 кнопками
    keyboard = types.InlineKeyboardMarkup()
    olympiad_button = types.InlineKeyboardButton(text="Олимпиады", callback_data="olympiad_events")
    test_button = types.InlineKeyboardButton(text="Пробники", callback_data="test_events")
    other_button = types.InlineKeyboardButton(text="Другое", callback_data="other_events")
    menu_button = types.InlineKeyboardButton(text="В меню", callback_data="menu")
    keyboard.add(olympiad_button, test_button, other_button, menu_button)

    # Отправляем сообщение "Выберите категорию" с клавиатурой
    bot.send_message(call.message.chat.id, "Выберите категорию", reply_markup=keyboard)



@bot.callback_query_handler(func=lambda call: call.data == 'olympiad_events')
def handle_olympiads(callback_query):
    # Создаем инлайн-кнопку "в меню"
    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    admin_new_text_olimpiad = types.InlineKeyboardButton(text="изменить текст", callback_data="new_text_olimp")
    # Создаем клавиатуру и добавляем кнопку "в меню"
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)
    if callback_query.message.chat.id in admins:
        keyboard.add(admin_new_text_olimpiad)
    
    # Отправляем сообщение
    bot.send_message(callback_query.message.chat.id, olimpiad_text[-1],reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data == 'new_text_olimp')
def handle_olympiads(callback_query):
    # Создаем инлайн-кнопку "в меню"
    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    # Создаем клавиатуру и добавляем кнопку "в меню"
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    # Отправляем сообщение
    text = "отправте новый текст, новые строки разделите \\n. \nПример : Петя иванов получил 5.\\nВася иванов получил 4.\\n\nВ данном случае вывод будет таким : \nПетя иванов получил 5.\nВася иванов получил 4.\n Примечание : Даже если новый текст содержит всего одну строчку все равно поставте в конец \\n "
    msg = bot.send_message(callback_query.message.chat.id, text,reply_markup=keyboard)
    bot.register_next_step_handler(msg, new_text_olimp)

    def new_text_olimp(message):
        olimpiad_test_text.append(message.text)
        text = olimpiad_test_text[-1].split("\\n")
        text.pop(-1)
        pr = []
        for k in range(len(text)):
            j = list(text[k])
            j.insert(0,"◉ ")
            j.append("\n")
            pr.append("".join(j))

        j = list(pr[-1])
        j.pop(-1)
        j.pop(-1)

        pr.pop(-1)
        pr.append("".join(j))


        olimpiad_test_text.append("".join(pr))
        text = "После изменения текст будет выглядеть так :\nОлимпиады\n" + olimpiad_test_text[-1]

        accept_correct_text_button = types.InlineKeyboardButton(text="подтвердить изменение", callback_data="accept_correct_olimp_text")
        menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
        # Создаем клавиатуру и добавляем кнопку "в меню"
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        keyboard.add(accept_correct_text_button,menu_button)

        bot.send_message(message.chat.id,text,reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data == 'accept_correct_olimp_text')
def handle_trials(callback_query):
    olimpiad_text.append(olimpiad_text[-1])

    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    bot.send_message(callback_query.message.chat.id, "Текст успешно изменен",reply_markup=keyboard)
                


@bot.callback_query_handler(func=lambda call: call.data == 'test_events')
def handle_trials(callback_query):
    # Создаем инлайн-кнопку "в меню"
    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
    # Создаем клавиатуру и добавляем кнопку "в меню"
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    # Отправляем сообщение
    bot.send_message(callback_query.message.chat.id, "1\n2\n3\n",reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data == 'other_events')
def handle_trials(callback_query):
    # Создаем инлайн-кнопку "в меню"
    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
    # Создаем клавиатуру и добавляем кнопку "в меню"
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    # Отправляем сообщение
    bot.send_message(callback_query.message.chat.id, "Другие события",reply_markup=keyboard)


# Обработчик нажатия на кнопку "В меню"
@bot.callback_query_handler(func=lambda call: call.data == "menu")
def menu_handler(call):
    # Создаем объект клавиатуры с одной кнопкой
    keyboard = types.InlineKeyboardMarkup()
    important_events_button = types.InlineKeyboardButton(text="Важные события", callback_data="important_events")
    doska = types.InlineKeyboardButton(text="Доска достижений", callback_data="doska")
    admin_panel = types.InlineKeyboardButton(text="ADMIN PANEL", callback_data="admin_panel")
    keyboard.add(important_events_button,doska)

    if call.message.chat.id in admins:
        keyboard.add(admin_panel)

    # Отправляем сообщение "Привет! Имя, Это бот ИША" с клавиатурой
    bot.send_message(call.message.chat.id, "Привет! " + call.message.chat.first_name + ", Это бот ИША", reply_markup=keyboard)


# Запускаем бота
bot.polling()


проблема у меня тут :
@bot.callback_query_handler(func=lambda call: call.data == 'new_text_olimp')
def handle_olympiads(callback_query):
    # Создаем инлайн-кнопку "в меню"
    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    # Создаем клавиатуру и добавляем кнопку "в меню"
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    # Отправляем сообщение
    text = "отправте новый текст, новые строки разделите \\n. \nПример : Петя иванов получил 5.\\nВася иванов получил 4.\\n\nВ данном случае вывод будет таким : \nПетя иванов получил 5.\nВася иванов получил 4.\n Примечание : Даже если новый текст содержит всего одну строчку все равно поставте в конец \\n "
    msg = bot.send_message(callback_query.message.chat.id, text,reply_markup=keyboard)
    bot.register_next_step_handler(msg, new_text_olimp)

    def new_text_olimp(message):
        olimpiad_test_text.append(message.text)
        text = olimpiad_test_text[-1].split("\\n")
        text.pop(-1)
        pr = []
        for k in range(len(text)):
            j = list(text[k])
            j.insert(0,"◉ ")
            j.append("\n")
            pr.append("".join(j))

        j = list(pr[-1])
        j.pop(-1)
        j.pop(-1)

        pr.pop(-1)
        pr.append("".join(j))


        olimpiad_test_text.append("".join(pr))
        text = "После изменения текст будет выглядеть так :\nОлимпиады\n" + olimpiad_test_text[-1]

        accept_correct_text_button = types.InlineKeyboardButton(text="подтвердить изменение", callback_data="accept_correct_olimp_text")
        menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
        # Создаем клавиатуру и добавляем кнопку "в меню"
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        keyboard.add(accept_correct_text_button,menu_button)

        bot.send_message(message.chat.id,text,reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data == 'accept_correct_olimp_text')
def handle_trials(callback_query):
    olimpiad_text.append(olimpiad_text[-1])

    menu_button = types.InlineKeyboardButton(text="в меню", callback_data="menu")
    
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(menu_button)

    bot.send_message(callback_query.message.chat.id, "Текст успешно изменен",reply_markup=keyboard)


а точнее : bot.register_next_step_handler(msg, new_text_olimp);def new_text_olimp(message):

ошибка , которую выдает консоль : UnboundLocalError: local variable 'new_text_olimp' referenced before assignment

Был бы вам признателен , если бы вы мне помогли !
  • Вопрос задан
  • 2024 просмотра
Решения вопроса 1
SoreMix
@SoreMix
yellow
1. Не надо здесь вкладывать одну функцию в другую
2. Ошибка явно говорит о том, что пытаетесь использовать переменную до её обяъвления, так и есть, сначала обращаетесь к new_text_olimp, а создаёте её только в следующей строке.

Решится просто выносом new_text_olimp из функции просто в тело скрипта.

Ну и конечно функции бы переименовать, чтобы имена были уникальными
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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