Как изменить настройки динамической клавиатуры для разных видов сообщений?

Как добавить кнопку удаления для каждого заказа из списка и привязать соответствующий колбек к каждой кнопке, при выводе сообщений в один поток?
Изображение к вопросу
  • 18 ноября 2023 г. 7:49
Ответы на вопрос 2
1. Для изменения настроек динамической клавиатуры для разных видов сообщений, вам необходимо использовать метод "reply_markup" при отправке каждого сообщения. Параметр "reply_markup" принимает объект типа ReplyKeyboardMarkup, InlineKeyboardMarkup или другой тип клавиатуры.

Например, если вы хотите отправить сообщение с ReplyKeyboardMarkup, вы можете создать объект клавиатуры и передать его в параметр "reply_markup":

```python
from telegram import ReplyKeyboardMarkup, KeyboardButton

# Создание клавиатуры
keyboard = ReplyKeyboardMarkup(
    keyboard=[
        [KeyboardButton(text='Кнопка 1')],
        [KeyboardButton(text='Кнопка 2')]
    ],
    resize_keyboard=True
)

# Отправка сообщения с клавиатурой
bot.send_message(chat_id=chat_id, text='Текст сообщения', reply_markup=keyboard)
```

Вы можете создать разные виды клавиатур для разных сообщений, изменяя содержимое и структуру кнопок.

2. Чтобы добавить кнопку удаления для каждого заказа из списка и привязать соответствующий колбек к каждой кнопке при выводе сообщений в один поток, вы можете использовать InlineKeyboardMarkup.

InlineKeyboardMarkup позволяет создавать кнопки, отображаемые внутри сообщения, которые могут быть нажаты и обрабатываться с помощью колбеков.

```python
from telegram import InlineKeyboardMarkup, InlineKeyboardButton

# Создание клавиатуры
keyboard = InlineKeyboardMarkup(
    inline_keyboard=[
        [InlineKeyboardButton(text='Удалить заказ 1', callback_data='delete_order_1')],
        [InlineKeyboardButton(text='Удалить заказ 2', callback_data='delete_order_2')]
    ]
)

# Отправка сообщения с клавиатурой
bot.send_message(chat_id=chat_id, text='Список заказов', reply_markup=keyboard)
```

В данном примере каждая кнопка имеет текст для отображения и соответствующий колбек, который будет вызываться при нажатии кнопки. Вы можете добавить больше кнопок и указать разные колбеки для каждой кнопки в зависимости от ваших потребностей.
Пример на aiogram 2.25. Используйте message.from_user.id или callback.from_user.id вместо user_1. Замените словарь на базу данных.

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup

bot = Bot('')
dp = Dispatcher(bot)

user_1 = {'orders': {'заказ 1', 'заказ 2', 'заказ 3'}}

@dp.message_handler(commands=['start'])
async def list_orders(message: types.Message):
    if user_1['orders']:
        for order in user_1['orders']:
            await message.answer(
                text=order,
                reply_markup=InlineKeyboardMarkup().add(InlineKeyboardButton('Удалить', callback_data='Удалить заказ'))
            )
    else:
        await message.answer("no orders.")

@dp.callback_query_handler(text='Удалить заказ')
async def delete_order(callback: types.CallbackQuery):
    await callback.answer()
    order = callback.message.text
    if order in user_1['orders']:
        user_1['orders'].remove(order)
        await callback.message.answer(text=f'{order} удален')
    else:
        await callback.message.answer(text=f'{order} не найден')
    print(user_1['orders'])

executor.start_polling(dp)
Похожие вопросы