Задать вопрос
@torchfinger

Как сделать так чтобы инлайн кнопки не дублировались aiogram?

Есть такой код:
keyboard_bar_inline_tarif_buy_status = InlineKeyboardMarkup(row_width=1)
keyboard_bar_inline_tarif_buy_status_btn1 = InlineKeyboardButton(text='1', callback_data='pay1')
keyboard_bar_inline_tarif_buy_status_btn2 = InlineKeyboardButton(text='2', callback_data='pay2')
keyboard_bar_inline_tarif_buy_status_btn3 = InlineKeyboardButton(text='3', callback_data='pay3')
keyboard_bar_inline_tarif_buy_status_btn4 = InlineKeyboardButton(text='4', callback_data='pay4')
keyboard_bar_inline_tarif_buy_status_btn5 = InlineKeyboardButton(text='5', callback_data='pay5')
keyboard_bar_inline_tarif_buy_status_btn6 = InlineKeyboardButton(text='6', callback_data='pay6')

@dp.message_handler(lambda message: message.text == ' Мои покупки')
async def buy_status(message : types.Message):
    cur.execute('SELECT TARIF1 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn1)

    cur.execute('SELECT TARIF2 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn2)

    cur.execute('SELECT TARIF3 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn3)

    cur.execute('SELECT TARIF4 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn4)

    cur.execute('SELECT TARIF5 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn5)

    cur.execute('SELECT TARIF6 FROM users')
    data_total = cur.fetchone()
    if data_total[0] == 'PAID':
        keyboard_bar_inline_tarif_buy_status.add(keyboard_bar_inline_tarif_buy_status_btn6)

    await bot.send_message(message.from_user.id, f' Ваши купленные паки:', reply_markup=keyboard_bar_inline_tarif_buy_status, parse_mode='Markdown')


В процессе пользования ботом сначала выводятся 6 кнопок(так и нужно), но потом с каждым вводом команды "Мои покупки" прибавляется ещё 6 кнопок и так до бесконечности. Есть ли способ пофиксить это, чтобы при повторном нажатии кнопки не дублировались? Если да, то как реализовать?
  • Вопрос задан
  • 251 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@IKIQ
await bot.send_message(message.from_user.id, f' Ваши купленные паки:', reply_markup=keyboard_bar_inline_tarif_buy_status, parse_mode='Markdown')


Выдает новое сообщение и к нему новые инлайн кнопки, так?
ну и соответственно, Если еще раз написать команду "Мои покупки" он снова запустит все проверки и выдаст новую клавиатуру к новому сообщению.

Для того чтобы их убрать, можно редактировать сообщение к которому привязаны кнопки, отправляя ему reply_markup="" или reply_markup= None (не помню точно)
Ответ написан
Кнопки у вас добавляются лишние потому что вы просто каждый раз добавляете в InlineKeyboardMarkup кнопку, а keyboard_bar_inline_tarif_buy_status у вас глобальная переменная
Нужно вынести создание клавиатуры в отдельную функцию.
Также логику как-то переработать обращения к бд и самих кнопок, текста и callback'а
@dp.message_handler(lambda message: message.text == ' Мои покупки')
async def buy_status(message : types.Message):
    await bot.send_message(message.from_user.id, f' Ваши купленные паки:', reply_markup=keyboard_bar_inline_tarif_buy_status(), parse_mode='Markdown')
    
def keyboard_bar_inline_tarif_buy_status():
    kb = InlineKeyboardMarkup(row_width=1)
    for i in range(1, 7):
        cur.execute(f'SELECT TARIF{i} FROM users')
        data_total = cur.fetchone()
        if data_total[0] == 'PAID':
            kb.add(InlineKeyboardButton(text=f'{i}', callback_data=f'pay{i}'))
    return kb
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы