Как создать обработчик для динамически изменяющихся кнопок в aiogram?

Как можно написать эффективный код для отображения кнопок выбора сельсовета в телеграмм боте, чтобы не дублировать одну функцию для каждого сельсовета?
  • 17 мая 2024 г. 12:40
Ответы на вопрос 1
Для создания обработчика для динамически изменяющихся кнопок в aiogram, можно воспользоваться использованием InlineKeyboardMarkup и InlineKeyboardButton. Например, можно создать функцию, которая будет генерировать кнопки на основе полученных данных:

```python
from aiogram import types

async def generate_buttons(selsovets):
    keyboard = types.InlineKeyboardMarkup()
    
    for selsovet in selsovets:
        button = types.InlineKeyboardButton(text=selsovet, callback_data=f"selsovet_{selsovet}")
        keyboard.add(button)
    
    return keyboard

```

Далее, можно использовать эту функцию в обработчике сообщения, чтобы отправить пользователю кнопки выбора сельсовета:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.types import Message
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.utils import executor

bot = Bot(token='TOKEN')
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

# Отправка сообщения с кнопками выбора сельсовета
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    selsovets = ['Сельсовет 1', 'Сельсовет 2', 'Сельсовет 3']
    keyboard = await generate_buttons(selsovets)
    
    await message.answer('Выберите сельсовет:', reply_markup=keyboard)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

Таким образом, можно избежать дублирования одной и той же функции для каждого сельсовета, и создать обработчик, который будет генерировать кнопки на основе переданных данных.
Похожие вопросы