@Cesoneemzzz

Как заставить следующий handler выполняться сразу, после того, как выполнился другой, AIOgram?

Хочу зациклить выполнения определённого хэндлера до того момента, пока бы пользователь, посредством нажатия кнопки, сам бы не вышел из этого цикла.

Вот код первого хэндлера:
@dp.message_handler(state=Testing.easy_difficult_selected)
@dp.message_handler(lambda msg: msg == 'легкий')
async def testing_easy_difficult(message: types.Message, state: FSMContext):
    import random
    data = await state.get_data()
    i = 0
    answers = {}

    kbAnswersChoose = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True, row_width=2)
    category = data.get("category")
    words = await db.async_testing_easy_difficult()
    for word in words:
        answers[i] = word[0][1]
        i += 1
    for button_name, word in answers.items():
        button_name = KeyboardButton(word)
        kbAnswersChoose.insert(button_name)
    btnGoBack = KeyboardButton("Вернуться в главное меню")
    kbAnswersChoose.insert(btnGoBack)

    word_and_translate = random.choice(words[random.randint(0, 4)])
    word_originally = word_and_translate[0]
    word_translate = word_and_translate[1]

    await state.update_data(word_translate=word_translate)

    await message.answer(f"Дано слово: {word_originally}\n\n Каков его перевод?",
                         reply_markup=kbAnswersChoose)

    await Testing.waiting_for_choose_right_answer.set()


Вот код хэндлера, к которому переходит управление, после того, как пользователь отправил слово:
@dp.message_handler(state=Testing.waiting_for_choose_right_answer)
async def testing_answer(message: types.Message, state: FSMContext):
    await state.update_data(answer=message.text)

    data = await state.get_data()

    if data.get('answer') == data.get('word_translate'):
        await message.answer(f"Верно! Это слово переводится, как {data.get('answer')}!")
    else:
        await message.answer(f"К сожалению, ты ошибься. Это слово переводится, как {data.get('word_translate')}. Будь "
                             f"внимательнее в следующий раз!")

    await Testing.easy_difficult_selected.set()


Вот мне нужно, чтобы выполнения последнего хэндлера сразу же начал выполняться предыдущий; без отправки сообщения пользователем. Сейчас он начинает работать только в том случае, если пользователь ввёл любое сообщение.
  • Вопрос задан
  • 6293 просмотра
Пригласить эксперта
Ответы на вопрос 2
@96Semka
просто вызовите тот хандлер, как функцию
Ответ написан
serdjo2011
@serdjo2011
async def test(message: types.Message, state: FSMContext):  # Это хендлер
    await test_fun()  # Обычная функция
    await test_fun1(message, state)  # Функция с хендлера (с аргументами message, state)


async def test_fun():
    print("hello, world")


async def test_fun1(message: types.Message, state: FSMContext):
    print("word")
    await message.answer("44")
    date = await state.get_data()  # извлекаем данные с машины состояний
    print(str(date))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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