Продолжение Inline кнопки не срабатывает (см. описание) telebot

Рейтинг: 1Ответов: 2Опубликовано: 18.02.2023

Появилась проблема с продолжением текста по поступлению пробовал сделать следующее, но ничего не получилось:

  1. создал новый декоратор, который тоже обрабатывает Inline кнопки, только по идее должен подсоединять их к старым, не сработало
  2. сделал вложенное условие напрямую, также все подсоединил к все как надо, от чего это должно работать, но ничего не вышло
  3. сделать вложенный декоратор, тоже ничего не вышло
# добавил основные кнопки ( самое начало )
markup_main = types.InlineKeyboardMarkup()
markup_main1 = types.InlineKeyboardButton(text="По поступлению", callback_data="arrive")
markup_main2 = types.InlineKeyboardButton(text="По переводу", callback_data="transfer")
markup_main3 = types.InlineKeyboardButton(text="По проживанию в общежитиях", callback_data="dormitory")
markup_main4 = types.InlineKeyboardButton(text="По военной кафедре", callback_data="military_department")
markup_main.add(markup_main1, markup_main2, markup_main3, markup_main4)

# добавил кнопки о поступлении
markup_arrive = types.InlineKeyboardMarkup()
markup_arrive1 = types.InlineKeyboardButton(text="Бакалавриат /"
                                                 "cпециалитет",
                                            url="google.com",
                                            callback_data="bachelor")
markup_arrive2 = types.InlineKeyboardButton(text="Магистратура",
                                            url="google.com",
                                            callback_data="magistracy")
markup_arrive3 = types.InlineKeyboardButton(text="Аспирантура",
                                            url="google.com",
                                            callback_data="postgraduate")
markup_arrive4 = types.InlineKeyboardButton(text="Посмотреть дополнительную информацию по этим темам",
                                            callback_data="dop_inf")
markup_arrive5 = types.InlineKeyboardButton(text="Вернуться назад", callback_data="back_markup_main")
markup_arrive.add(markup_arrive1, markup_arrive2, markup_arrive3, markup_arrive4, markup_arrive5)

# нерабочий код ( вариант решения вопроса 1 ) при его использовании отсутствует вариант с вложенным декоратором и вложенным условием
@bot.callback_query_handler(func=lambda callback: True)
def arrive_answers(call):
    if call.data == "dop_inf":
        bot.send_message(call.message.chat.id, text="Выберите вопрос, который вас интересует: ",
                         reply_markup=markup_arrive_in_bachelor)
    elif call.data == "back_markup_arrive":
        bot.send_message(call.message.chat.id, text="Выбери, какой уровень образования тебя интересует",
                         reply_markup=markup_arrive)


# добавил кнопки с ответами на вопросы по поступлению в бакалавриант и специалитет
markup_arrive_in_bachelor = types.InlineKeyboardMarkup()
markup_arrive_in_bachelor1 = types.InlineKeyboardButton(
    text="Информация о требуемых документах при подаче заявления и сроках приема", callback_data="doc")
markup_arrive_in_bachelor2 = types.InlineKeyboardButton(text="Вернуться назад", callback_data="back_markup_arrive")
markup_arrive_in_bachelor.add(markup_arrive_in_bachelor1, markup_arrive_in_bachelor2)


# нерабочий код ( вариант решения вопроса 2 ) при его присутствии отсутствует вариант с вложенным декоратором и и новым callback_query, как в варианте 1
@bot.callback_query_handler(func=lambda call: True)
def start_menu(message):
    if message.data == "arrive":
        bot.send_message(message.message.chat.id, text="Выберите интересующий вас уровень образования: ",
                         reply_markup=markup_arrive)
        if message.data == "dop_inf":
            bot.send_message(message.message.chat.id, text="Выберите вопрос, который вас интересует: ",
                             reply_markup=markup_arrive_in_bachelor)
        elif message.data == "back_markup_arrive":
            bot.send_message(message.message.chat.id, text="Выбери, какой уровень образования тебя интересует",
                             reply_markup=markup_arrive)

# нерабочий код ( вариант решения 3 ) при его наличии отсутствует новы1 callback_query, как в варианте 1 и вложенное условие
@bot.callback_query_handler(func=lambda callback: True)
def arrive_answers(call):
    if call.data == "dop_inf":
        bot.send_message(call.message.chat.id, text="Выберите вопрос, который вас интересует: ",
                         reply_markup=markup_arrive_in_bachelor)
    elif call.data == "back_markup_arrive":
        bot.send_message(call.message.chat.id, text="Выбери, какой уровень образования тебя интересует",
                         reply_markup=markup_arrive)

Ответы

▲ 0Принят

Вот решение. Я существенно ничего не изменял, но если у меня работает, то скорее всего сможет и у Вас. Кнопка "получить дополнительную информацию..." исправна. Ответ основан на фрагменте кода, который Вы прислали, функцию старта добавил только для проверки. Тексты поудалял для наглядности тестирования, так что вернете их на свои места. Надеюсь, Ваша проблема будет устранена :)

import telebot
from telebot import types

API_TOKEN = '{Ваш токен}'

bot = telebot.TeleBot(API_TOKEN)

# добавил основные кнопки ( самое начало )
markup_main = types.InlineKeyboardMarkup()
markup_main1 = types.InlineKeyboardButton(text="По поступлению", callback_data="arrive")
markup_main2 = types.InlineKeyboardButton(text="По переводу", callback_data="transfer")
markup_main3 = types.InlineKeyboardButton(text="По проживанию в общежитиях", callback_data="dormitory")
markup_main4 = types.InlineKeyboardButton(text="По военной кафедре", callback_data="military_department")
markup_main.add(markup_main1, markup_main2, markup_main3, markup_main4)

# добавил кнопки о поступлении
markup_arrive = types.InlineKeyboardMarkup()
markup_arrive1 = types.InlineKeyboardButton(text="Бакалавриат /"
                                                 "cпециалитет",
                                            callback_data="bachelor")
markup_arrive2 = types.InlineKeyboardButton(text="Магистратура",
                                            url="google.com",
                                            callback_data="magistracy")
markup_arrive3 = types.InlineKeyboardButton(text="Аспирантура",
                                            url="google.com",
                                            callback_data="postgraduate")
markup_arrive4 = types.InlineKeyboardButton(text="Посмотреть дополнительную информацию по этим темам",
                                            callback_data="dop_inf")
markup_arrive5 = types.InlineKeyboardButton(text="Вернуться назад", callback_data="back_markup_main")
markup_arrive.add(markup_arrive1, markup_arrive2, markup_arrive3, markup_arrive4, markup_arrive5)

# добавил кнопки с ответами на вопросы по поступлению в бакалавриант и специалитет
markup_arrive_in_bachelor = types.InlineKeyboardMarkup()
markup_arrive_in_bachelor1 = types.InlineKeyboardButton(
    text="Информация о требуемых документах при подаче заявления и сроках приема", callback_data="doc")
markup_arrive_in_bachelor2 = types.InlineKeyboardButton(text="Вернуться назад", callback_data="back_markup_arrive")
markup_arrive_in_bachelor.add(markup_arrive_in_bachelor1, markup_arrive_in_bachelor2)

@bot.message_handler(commands=["start"])
def start_message(message):
    bot.send_message(message.chat.id, text="Добро пожаловать, {0.first_name}!, лялялялля".format(message.from_user), reply_markup=markup_main)


# Уже рабочий код, получается :)
@bot.callback_query_handler(func=lambda callback: True)
def arrive_answers(call):
    if call.data == "arrive":
        bot.send_message(call.message.chat.id, text="1: ",
                         reply_markup=markup_arrive)
    elif call.data == "bachelor":
        bot.send_message(call.message.chat.id, text="2: ",
                         reply_markup=markup_arrive_in_bachelor)
    elif call.data == "dop_inf":
        bot.send_message(call.message.chat.id, text="3: ",
                         reply_markup=markup_arrive_in_bachelor)
    elif call.data == "back_markup_arrive":
        bot.send_message(call.message.chat.id, text="4",
                         reply_markup=markup_arrive)
▲ 0

Если я вас правильно понял, то попробуйте таким способом (изменено):

@bot.callback_query_handler(lambda call: True)
def callback(call):
   if call.message:
      if call.data == 'dop_inf':
         bot.send_message(call.message.chat.id, text="Выберите вопрос, который вас интересует: ", reply_markup=markup_arrive_in_bachelor)
      if call.data == 'back_markup_arrive':
         bot.send_message(call.message.chat.id, text="Выбери, какой уровень образования тебя интересует", reply_markup=markup_arrive)

И я бы ещё сделал так, оно будет лучше выглядить, если просто менять сообщение, а не постоянно новое присылать:

if call.data == 'dop_inf':
   bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Выберите вопрос, который вас интересует: ", reply_markup=markup_arrive_in_bachelor)
if call.data == 'back_markup_arrive':
   bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Выбери, какой уровень образования тебя интересует", reply_markup=markup_arrive)