Удаление inline кнопок aiogram

Создаю бота на питоне для телеграма с использованием библиотеки aiogram. Столкнулся с проблемой удаления inline кнопок сообщения. Мне нужно удалять кнопки при нажатии на них. Я пробовал удалять кнопки через метод edit_reply_markup, где заменял клавиатуру на другую без этой кнопки. Но поскольку кнопок две, при "удалении" одной появляется кнопка на другую

Мой код ниже

from aiogram.dispatcher.filters.builtin import CommandStart
from aiogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.callback_data import CallbackData

callback_id = CallbackData("id", "button")

bot = Bot(token=BOT_TOKEN, parse_mode=types.ParseMode.HTML)
dp = Dispatcher(bot)

@dp.message_handler(CommandStart())
async def bot_start(message: types.Message):
    await bot.send_message(message.from_user.id, "some text", reply_markup=InlineKeyboardMarkup().add(InlineKeyboardButton("button1",callback_data=callback_id.new(button="button1"))).add(InlineKeyboardButton("button2",callback_data=callback_id.new(button="button2"))))

@dp.callback_query_handler(callback_id.filter(button="button1"))
async def ban(call: CallbackQuery, callback_data: dict):
    await call.answer()
    await call.message.edit_text(call.message.html_text+"\nbutton1 deleted")
    #В следующей строке хочу удалить button1 (заменяю клавиатурой без button1), но не известно удалена ли button2
    await call.message.edit_reply_markup(InlineKeyboardMarkup().add(InlineKeyboardButton("button2",callback_data=callback_id.new(button="button2"))))

@dp.callback_query_handler(callback_id.filter(button="button2"))
async def ban(call: CallbackQuery, callback_data: dict):
    await call.answer()
    await call.message.edit_text(call.message.html_text+"\nbutton2 deleted")
    #В следующей строке хочу удалить button2 (заменяю клавиатурой без button2), но не известно удалена ли button1
    await call.message.edit_reply_markup(InlineKeyboardMarkup().add(InlineKeyboardButton("button1",callback_data=callback_id.new(button="button1"))))


executor.start_polling(dp, skip_updates=True)

Так что я получаю такой результат:неправильно работает

А мне нужно введите сюда описание изображения

Заранее спасибо :)


Ответы (2 шт):

Автор решения: ASKIT

Я сделал вот такую функцию, работает отлично (плохого ничего пока не заметил).

# Remove Inline Button in Inline Menu
async def remove_inline_button(menu, button_callbacks: list):
    menu = menu['inline_keyboard']
    result = {'inline_keyboard': []}
    list_items_amount = 0

    for x in menu:
        result['inline_keyboard'].append([])

        for item in menu[list_items_amount]:
            if item['callback_data'] not in button_callbacks:
                result['inline_keyboard'][list_items_amount].append(item)

        list_items_amount += 1

    return result

Данный код удаляет кнопки из инлайн меню, по callback_data. Использование:

menu = InlineKeyboardMarkup().add(InlineKeyboardButton('Первая кнопка',
       callback_data='button_one')).add(InlineKeyboardButton('Вторая кнопка', 
       callback_data='button_two'))

menu = await remove_inline_button(menu, ['button_one'])

await bot.send_message(
    call.from_user.id, 'Меню для теста удаления кнопки!', reply_markup=menu)

На качество кода не претендую, сам новичок.

→ Ссылка
Автор решения: LuminiteTime

callback.message.reply_markup.inline_keyboard представляет собой обычный список list, так что можно удалять из него кнопки, как элементы из списка, например, с помощью pop()

callback.message.reply_markup.inline_keyboard.pop(-1)

Это удаление последней кнопки

→ Ссылка