Как изменить текст кнопки по нажатию aiogram?

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

Есть код:

def ishod_keyboard():
    eg_btn = InlineKeyboardButton('❌ Пиццу', callback_data='❌ Пиццу')
    steam_btn = InlineKeyboardButton('❌ Суши', callback_data='❌ Суши')
    requests_kb = InlineKeyboardMarkup(row_width=2).add(
        eg_btn, steam_btn
    )
    return requests_kb

@dp.callback_query_handler(lambda c: c.data == 'cart')
async def cmd_cart(callback: types.CallbackQuery):
    await callback.message.edit_text('Что будем заказывать?', reply_markup=markups.ishod_keyboard())

Как сделать так, чтобы по нажатию на кнопку, вместо крестика была галочка и наоборот?

Ответы

▲ 2

добавить state для сохранения состояния кнопки:

def ishod_keyboard():
    eg_btn = InlineKeyboardButton('❌ Пиццу', callback_data='eg_0')
    steam_btn = InlineKeyboardButton('❌ Суши', callback_data='steam_0')
    requests_kb = InlineKeyboardMarkup(row_width=2).add(
        eg_btn, steam_btn
    )
    return requests_kb

@dp.callback_query_handler(lambda c: c.data == 'cart')
async def cmd_cart(callback: types.CallbackQuery):
    markup = ishod_keyboard()
    msg = await callback.message.edit_text('Что будем заказывать?', reply_markup=markup)

@dp.callback_query_handler(lambda c: c.data.startswith(('eg_', 'steam_')))
async def on_keyboard_callback(callback_query: types.CallbackQuery):
    callback_data = callback_query.data
    button_state = int(callback_data.split('_')[-1])
    button_label = callback_data.split(' ')[-1]
    if button_state == 0:
        new_button_state = 1
        new_button_label = '✅ ' + button_label[2:]
    else:
        new_button_state = 0
        new_button_label = '❌ ' + button_label[2:]

    new_callback_data = f"{callback_data.split('_')[0]}_{new_button_state}"

    markup = InlineKeyboardMarkup(row_width=2).add(
        InlineKeyboardButton(new_button_label, callback_data=new_callback_data)
    )

    await bot.edit_message_reply_markup(
        callback_query.message.chat.id,
        callback_query.message.message_id,
        reply_markup=markup
    )