python telebot - Не вызывается функция через (call.message)
Всем привет. Пытаюсь разобраться с телеграм-ботом. Суть в чём, есть три страницы:
choose_language = выбор языка
ru_main_menu = меню на русском языке
ru_freshman = одна из тем
Я хотел реализовать кнопку возврата на предыдущий уровень. Так, есть кнопка возврата из ru_main_menu в choose_language. Хотел сделать кнопку возврата из ru_freshman по тому же алгоритму, но питон это есть не захотел. Попытки обсудить с ChatGPT успехом не увенчались, поэтому я здесь.
Я плохо уже понимаю, что из-за чего тут, поэтому буду очень рад, если объясните, что не так с кодом и как это исправить.
(p.s. если что, таких "возвратов" планируется много. Проще говоря, на каждой странице я хочу реализовать "шаг назад")
Вот код:
import telebot
from telebot.types import InlineKeyboardMarkup,InlineKeyboardButton,ReplyKeyboardMarkup,KeyboardButton #импорт необходимых библиотек
bot=telebot.TeleBot('API') #Вводим API-ключ
@bot.message_handler(commands=['start']) #меню выбора языка
def choose_language(message):
lang = InlineKeyboardMarkup()
lang.add(InlineKeyboardButton('Русский', callback_data='ru'))
lang.add(InlineKeyboardButton('English', callback_data='eng'))
bot.send_message(message.chat.id, 'Привет! Выбери язык.', reply_markup=lang)
@bot.callback_query_handler(func=lambda call: call.data == 'ru' or call.data == 'changelanguage') #Меню на русском
def ru_main_menu(call):
if call.data=='ru':
ru_menu=InlineKeyboardMarkup()
ru_menu.add(InlineKeyboardButton('FAQ', callback_data='ru_faq'))
ru_menu.add(InlineKeyboardButton('Кнопка2', callback_data='ru_butt2'))
ru_menu.add(InlineKeyboardButton('Кнопка3', callback_data='ru_butt3'))
ru_menu.add(InlineKeyboardButton('Кнопка4', callback_data='ru_butt4'))
ru_menu.add(InlineKeyboardButton('Вернуться к выбору языка', callback_data='changelanguage'))
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
text='Выбран русский язык. Выберите интересующий вас запрос:', reply_markup=ru_menu)
elif call.data=='changelanguage':
bot.delete_message(call.message.chat.id,message_id=call.message.message_id)
choose_language(call.message)
@bot.callback_query_handler(func=lambda call: call.data == 'eng' or call.data == 'changelanguage') #Меню на английском
def eng_main_menu(call):
if call.data == 'eng':
eng_menu=InlineKeyboardMarkup()
eng_menu.add(InlineKeyboardButton('fаq', callback_data='eng_faq'))
eng_menu.add(InlineKeyboardButton('Button2', callback_data='eng_butt2'))
eng_menu.add(InlineKeyboardButton('Button3', callback_data='eng_butt3'))
eng_menu.add(InlineKeyboardButton('Button4', callback_data='eng_butt4'))
eng_menu.add(InlineKeyboardButton('Вернуться к выбору языка', callback_data='changelanguage'))
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
text='English. Choose your option:', reply_markup=eng_menu)
elif call.data == 'changelanguage':
bot.delete_message(call.message.chat.id, message_id=call.message.message_id)
choose_language(call.message)
@bot.callback_query_handler(func=lambda call: True) #Меню при нажатии кнопки "FAQ" в ru_main_menu
def ru_freshman(call):
if call.data=='ru_faq':
rufaq_menu = InlineKeyboardMarkup()
rufaq_menu.add(InlineKeyboardButton('text1', callback_data='ru_per1'))
rufaq_menu.add(
InlineKeyboardButton('text2',callback_data='ru_per2'))
rufaq_menu.add(InlineKeyboardButton('text3',callback_data='ru_per3'))
rufaq_menu.add(InlineKeyboardButton('text4', callback_data='ru_per4'))
rufaq_menu.add(InlineKeyboardButton('text5',callback_data='ru_per5'))
rufaq_menu.add(InlineKeyboardButton('Назад в меню',callback_data='ru_back_to_main'))
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
text='Здесь какой-то текст')
elif call.data=='ru_back_to_main':
bot.delete_message(chat_id=call.message.chat.id, message_id=call.message.message_id)
# ru_main_menu(call.message) |Не работает. при вызове функции ru_main_menu через 'ru_main_menu(call.message)',
# мы пытаемся передать объект типа Message, вместо объекта типа CallbackQuery.
# Это вызывает ошибку, так как ru_main_menu ожидает объект типа CallbackQuery.
choose_language(call.message) #|Работает, но, это не то. Мне необходимо чтобы вызывалась другая функция
bot.polling()
Ответы (1 шт):
Автор решения: kolo
→ Ссылка
elif call.data == 'changelanguage':
lang = InlineKeyboardMarkup()
lang.add(InlineKeyboardButton('Русский',callback_data='ru'))
lang.add(InlineKeyboardButton('English', callback_data='eng'))
bot.edit_message_text(
call.message.chat.id, message_id=call.message.message_id,
text = 'Привет! Выбери язык.', reply_markup = lang)
и по такой же логике осуществляется любой шаг назад