Как сделать кнопнку возврата в aiogram

Рейтинг: 0Ответов: 1Опубликовано: 07.07.2023

Прикладываю код, нужно чтобы по кнопке "back" был возврат либо к "dice" либо к "time", не могу разобраться как это сделать. Помогите пожалуйста.

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher, FSMContext
from aiogram.types import callback_query, InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.utils import executor
from aiogram.dispatcher.filters import Text
import random
from config import TOKEN
import time

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def process_start_command(ping: types.Message):
    keyboard = InlineKeyboardMarkup()
    back_button = InlineKeyboardButton('Назад', callback_data='back')
    keyboard.add(back_button)
    a = types.ReplyKeyboardMarkup(resize_keyboard=True)
    buttons = ['dice', 'time']
    a.add(*buttons)
    await ping.answer('abc', reply_markup=a)


@dp.message_handler(Text(equals='dice'))
async def echo_message(msg: types.Message, state:FSMContext):
    a = types.ReplyKeyboardMarkup(resize_keyboard=True)
    buttons = ['one', 'two', 'twenty', 'back']
    a.add(*buttons)
    await msg.answer('abc', reply_markup=a)
    await state.reset_state(with_data=False)
    if msg=='back':
        a = types.ReplyKeyboardRemove()

@dp.message_handler(Text(equals='one'))
async def echo_message(msg: types.Message):
    r = random.choice(range(1, 7))
    await msg.answer(r)

@dp.message_handler(Text(equals='two'))
async def echo_message(msg: types.Message):
    r = random.choice(range(1, 13))
    await msg.answer(r)

@dp.message_handler(Text(equals='twenty'))
async def echo_message(msg: types.Message):
    r = random.choice(range(1, 21))
    await msg.answer(r)

#@dp.message_handler(Text(equals='back'))
#async def echo_message(msg: types.Message):

@dp.message_handler(Text(equals='time'))
async def echo_message(msg: types.Message, state:FSMContext):
    a = types.ReplyKeyboardMarkup(resize_keyboard=True)
    buttons = ['30sec', '1', '5', 'back']
    a.add(*buttons)
    await msg.answer('abc', reply_markup=a)
    await state.reset_state(with_data=False)
    if msg=='back':
        a = types.ReplyKeyboardRemove()

@dp.message_handler(Text(equals='close'))
async def echo_message(msg: types.Message):
    global f
    f = msg.text

@dp.message_handler(Text(equals='30sec'))
async def echo_message(msg: types.Message):
    await msg.answer(f'Засек на 30 секунд')
    b = time.perf_counter()
    a = types.ReplyKeyboardMarkup(resize_keyboard=True)
    buttons = ['close']
    a.add(*buttons)
    await msg.answer('abc', reply_markup=a)
    f = msg.text
    while f != 30:
        c = time.perf_counter()
        d = c - b
        if d == 5:
            await msg.answer('Таймер закончен')
            break
    else:
        await msg.answer("Таймер сброшен")



if __name__ == '__main__':
    executor.start_polling(dp)

Ответы

▲ 0

Когда возникает необходимость при нажатии кнопки назад вернуться в предыдущее состояние, то первая мысль, которая приходит в голову, "Мне нужно как-то запоминать состояние из которого я пришел." Правильное решение вашей проблемы будет заключаться в использовании FSM (Finite state machine, в переводе: "Конечный автомат"). С примером реализации FSM можете ознакомиться в официальной документации aiogram: https://docs.aiogram.dev/en/latest/examples/finite_state_machine_example.HTML

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