Не работает сallback для кнопки (Aiogram) созданный в цикле
Я пишу Бота для Telegram на python aiogram. У меня есть функция которая по сути создаёт клавиатуру и callback к ней. Функция принимает список из атрибутов и возвращает объект клавиатуры, а Сallback она должна сразу отправлять в Dispatcher. Все работает, но есть одна проблема, callback работает только у последней из созданных кнопок.
Вот как выглядит код функции:
from aiogram.types import CallbackQuery, Message,\
ReplyKeyboardMarkup,ReplyKeyboardRemove, \
InlineKeyboardButton, InlineKeyboardMarkup \
from main import dp, bot
def Keyboard(kb_config):
keyboard = InlineKeyboardMarkup()
for rows in kb_config:
keyboard.add(InlineKeyboardButton(
callback_data=rows[0][1],
text=rows[0][1]))
for atr in rows[1:]:
btn = InlineKeyboardButton(
callback_data=atr[0],
text=atr[1])
keyboard.insert(btn)
for atr in rows:
@dp.callback_query_handler(lambda c: c.data == atr[0])
async def callback(callback_query: CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id,
text=atr[2],
reply_markup=atr[3])
return keyboard
Вот код где она вызывается:
from aiogram.types import CallbackQuery, Message
from main import dp, bot
from keyboard import Keyboard
@dp.message_handler(commands=['Start'])
async def process_admin_command(message: Message):
await bot.send_photo(
chat_id=message.from_user.id,
photo="AgACAgIAAxkBAAIGqmA4Bdp4L1gjNomGkCELzwulilJjAAJktzEbmQLBSZnjBqQTXT9b6Epdmi4AAwEAAwIAA20AA5myBQABHgQ",
reply_markup=Keyboard([[
["1","кнопка1","текст сообщения",None],
["2","кнопка2","текст сообщения",None],
["3","кнопка3","текст сообщения",None]
#[callback_data,text,Текст в Callback, клавиатура в Callback]
]]),
caption="Описание бота")
Ответы (1 шт):
Автор решения: 5c0rp
→ Ссылка
from aiogram import Bot, Dispatcher, executor, types
bot = Bot('543240427:AAEYnOxVx5pvNA9cUoBTqrXNmceHTRm0chg')
dp = Dispatcher(bot)
def keyboard(kb_config):
_keyboard = types.InlineKeyboardMarkup()
for rows in kb_config:
btn = types.InlineKeyboardButton(
callback_data=rows[0],
text=rows[1]
)
_keyboard.insert(btn)
return _keyboard
@dp.callback_query_handler()
async def callback(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id, text=callback_query.data)
await bot.send_message(callback_query.from_user.id, text=callback_query.data)
@dp.message_handler(commands=['start'])
async def process_admin_command(message: types.Message):
await bot.send_photo(
chat_id=message.from_user.id,
photo="https://icdn.lenta.ru/images/2020/07/13/16/20200713161106967/square_320_4dd6db2859b29f4b1ba2d684155a5cc6.png",
reply_markup=keyboard([
["1", "кнопка1", "текст сообщения", None],
["2", "кнопка2", "текст сообщения", None],
["3", "кнопка3", "текст сообщения", None]
]),
caption="Описание бота"
)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)