Удаление 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 шт):
Я сделал вот такую функцию, работает отлично (плохого ничего пока не заметил).
# 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)
На качество кода не претендую, сам новичок.
callback.message.reply_markup.inline_keyboard представляет собой обычный список list, так что можно удалять из него кнопки, как элементы из списка, например, с помощью pop()
callback.message.reply_markup.inline_keyboard.pop(-1)
Это удаление последней кнопки
