@Sadons

При создании второго хэндлера CallbackQuery, все остальные перестают работать, как сделать что бы срабатывали оба?

У меня в коде есть один хэндлер на инлайн кнопки, который срабатывает и заменяет текст. Сейчас появилась надобность в другом хэндлере, так как вызываю в другой функции инлайн кнопки.
Для быстрой читабельности сокращу код
Это первый хэндлер
@bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        if call.data == 'yes':
            bot.send_message(message.from_user.id, 'Ваша заявка была принята!')
        if call.data == 'no':
            bot.send_message(message.from_user.id, 'Ваша заявка была отклонена!')

Вызывается тут:
def text(message):
            item_yes = types.InlineKeyboardButton(text='Принять', callback_data='yes')
            item_no = types.InlineKeyboardButton(text='Отказаться', callback_data='no')
            markup_inline.add(item_yes, item_no)
            bot.send_message(-1001775453865,
                         '<b>НОВАЯ ЗАЯВКА !\n {0}\n {1}\n {2}\nЗаказчик: @{3}'.format(
                             message.text, message.from_user.id, message.from_user.first_name,
                             message.from_user.username),reply_markup=markup_inline, parse_mode="html")

Как только я добавляю второй хэндлер, вот этот:
@bot.callback_query_handler(func=lambda call: True)
    def purchaseCrystal_call(call):
        if call.data == '150_p':
            count_150 = crystal.create_invoice(150)
            bot.send_message(call.message.from_user.id, f"{count_150.url}")

Который вызывается тут:
def purchase_crystal(message):
    markup_count_purchase1 = types.InlineKeyboardMarkup()
    invoice_5 = types.InlineKeyboardButton(text='150р', callback_data='150_p')
    invoice_6 = types.InlineKeyboardButton(text='300р', callback_data='300_p')
    invoice_7 = types.InlineKeyboardButton(text='450p', callback_data='450_p')
    invoice_8 = types.InlineKeyboardButton(text='600р', callback_data='600_p')
    markup_count_purchase1.add(invoice_5, invoice_6, invoice_7, invoice_8)
    bot.send_message(message.from_user.id, "<b>Выберите сумму пополнения:</b>",
                     parse_mode="html", reply_markup=markup_count_purchase1)

То разом все инлайн кнопки перестают работать, пробовал:
@bot.callback_query_handler(func=lambda call: call.data.startswith('text'))

Не помогло, так же видел про паттерны, но никакую информацию по ним не нашёл :(
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потому что ты в обоих случаях прописываешь callback handler, обрабатывающий ВСЕ кнопки (так как в качестве func ты передаёшь предикат, всегда возвращающий истину, т.е. "я готов это обработать").
Далее, что значит "не помогло"?
@bot.callback_query_handler(func=lambda call: call.data.startswith('text'))

Вот прямо так и писал? или всё-таки заменял 'text' на что-то своё?
Потому что если так и писал, то ты тем самым сказал "вызывай этот обработчик для тех случаев, когда call.data начинается со слова text". У тебя ни в одном случае call.data не начинается с text.

Тут идея проста как два пальца: сделай иерархию в тексте call.data.
Например, в первом случае
item_yes = types.InlineKeyboardButton(text='Принять', callback_data='order_approve.yes')
item_no = types.InlineKeyboardButton(text='Отказаться', callback_data='order_approve.no')

Тут order_approve - что-то типа пространства имён, чтобы можно было отличать значения, приходящие по разным поводам (т.е. кнопки, обрабатываемые в рамках разных диалогов).
И тогда прописать обработчик можно будет так
@bot.callback_query_handler(func=lambda call: call.data.startswith('order_approve.'))


Во втором случае сделай по аналогии.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы