Как реализовать в telegram боте множественный выбор кнопок?
Подскажите как проще всего в telegram боте в библиотеке aiogram реализовать множественный выбор для пользователя. Например пользователь выбирает 3 варианта из 10 и на основе его выбора выводится определенный вариант. Желательно реализовать это через inline кнопки. Видел пример с google таблицами, но возможно есть вариант проще. Проект разбит на модули в файле с инлайн клавиатурой лежит следующий код:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
ikb_calc_exam = InlineKeyboardMarkup(row_width=3)
ib_calc_geography = InlineKeyboardButton(text='География',
callback_data='cd_calc_geography')
ib_calc_literature = InlineKeyboardButton(text='Литература',
callback_data='cd_calc_literature')
ib_calc_chemistry = InlineKeyboardButton(text='Химия',
callback_data='cd_calc_chemistry')
ib_calc_russian = InlineKeyboardButton(text='Русский язык',
callback_data='cd_calc_russian')
ib_calc_mathematics = InlineKeyboardButton(text='Математика (профильный уровень)',
callback_data='cd_calc_mathematics')
ib_calc_history = InlineKeyboardButton(text='История',
callback_data='cd_calc_history')
ib_calc_physics = InlineKeyboardButton(text='Физика',
callback_data='cd_calc_physics')
ib_calc_socials = InlineKeyboardButton(text='Обществознание',
callback_data='cd_calc_socials')
ib_calc_biology = InlineKeyboardButton(text='Биология',
callback_data='cd_calc_biology')
ib_calc_international = InlineKeyboardButton(text='Иностранный язык',
callback_data='cd_calc_international')
ib_calc_informatics = InlineKeyboardButton(text='Информатика и информационно-коммуникационные технологии',
callback_data='cd_calc_informatics')
ib_calc_professional = InlineKeyboardButton(text='Профессиональное испытание',
callback_data='cd_calc_professional')
ib_calc_creavity = InlineKeyboardButton(text='Творческое испытание',
callback_data='cd_calc_creavity')
ikb_calc_exam.add(ib_calc_geography).add(ib_calc_literature).add(ib_calc_chemistry).add(ib_calc_russian).add(
ib_calc_mathematics).add(ib_calc_history).add(ib_calc_physics).add(ib_calc_socials).add(ib_calc_biology).add(
ib_calc_international).add(ib_calc_informatics).add(ib_calc_professional).add(ib_calc_creavity)
И код из файла где попытался реализовать множественный выбор:
from aiogram import types, Dispatcher
from misc import bot, dp
from Keyboard.Keyboard_calc_exam import ikb_calc_exam
from aiogram.utils.callback_data import CallbackData
cd = CallbackData('calc_exam', 'options')
options_message = {
('geographi', 'russian', 'mathematics'): 'Message 1',
('geographi', 'russian', 'socials'): 'Message 2',
('geographi', 'russian', 'biology'): 'Message 3',
('literature', 'russian', 'history'): 'Message 4',
('literature', 'russian', 'socials'): 'Message 5',
('literature', 'russian', 'international'): 'Message 6',
('literature', 'russian', 'professional'): 'Message 7',
('literature', 'russian', 'creavity'): 'Message 8',
('chemistry', 'russian', 'mathematics'): 'Message 9',
('chemistry', 'russian', 'socials'): 'Message 10',
('chemistry', 'russian', 'biology'): 'Message 11',
('russian', 'mathematics', 'history'): 'Message 12',
('russian', 'mathematics', 'physics'): 'Message 13',
('russian', 'mathematics', 'socials'): 'Message 14',
('russian', 'mathematics', 'biology'): 'Message 15',
('russian', 'mathematics', 'international'): 'Message 16',
('russian', 'mathematics', 'informatics'): 'Message 17',
('russian', 'history', 'socials'): 'Message 18',
('russian', 'history', 'biology'): 'Message 19',
('russian', 'history', 'international'): 'Message 20',
('russian', 'physics', 'socials'): 'Message 21',
('russian', 'physics', 'biology'): 'Message 22',
('russian', 'physics', 'informatics'): 'Message 23',
('russian', 'socials', 'biology'): 'Message 24',
('russian', 'socials', 'international'): 'Message 25',
('russian', 'socials', 'professional'): 'Message 26',
('russian', 'socials', 'creavity'): 'Message 27',
('russian', 'international', 'creavity'): "message 28"
}
@dp.message_handler(commands=['calc_exam'])
async def calc_exam(message: types.Message):
await bot.send_message(chat_id=message.from_user.id,
text='<em>Выбери три предмета</em>',
parse_mode="HTML",
reply_markup=ikb_calc_exam)
await message.delete()
@dp.callback_query_handler(lambda c: c.data.startswith('calc_exam'))
async def process_calc_exam_callback(callback_query: types.CallbackQuery):
selected_options = callback_query.data.split(':')[1].split(',')
await bot.answer_callback_query(callback_query.id)
new_cd = cd.new(options=','.join(selected_options))
keyboard = ikb_calc_exam.copy()
for button in keyboard.inline_keyboard[0]:
if button.callback_data.split(':')[1] in selected_options:
button.text = f'✅ {button.text}'
button.callback_data = new_cd
else:
button.text = f'❌ {button.text}'
button.callback_data = button.callback_data.split(':')[0]
if len(selected_options) == 3:
if tuple(selected_options) in options_message:
message_text = options_message[tuple(selected_options)]
else:
message_text = 'Invalid option combination'
await bot.send_message(chat_id=callback_query.from_user.id, text=message_text)
else:
await bot.send_message_reply_markup(chat_id=callback_query.message.chat.id,
message_id=callback_query.message.message_id,
reply_markup=keyboard)
def register_handler_calc_exam(dp: Dispatcher):
dp.register_message_handler(calc_exam, commands=[calc_exam])
Но при запуске бота появляется клавиатура, но при нажатии не чего не происходит и ошибки не появляются, в чем может быть проблема?