@onemorevagabund

Как сделать многоуравневую клавиатуру в Telegram bot?

Как сделать так, чтобы после нажатия на кнопку "№1" открывалось фото?
Вот пример кода (я использую только инлайн клавиатуру. всё зависит от текста сообщения пользователя):
import telebot
from telebot import types

token = ''
bot = telebot.TeleBot(token)
 
@bot.message_handler(commands=['start'])
def welcome(message):
    sticker = open('files/welcome.webp', 'rb')
    bot.send_sticker(message.chat.id, sticker)
 
    bot.send_message(message.chat.id, "Привет, {0.first_name}! " .format(message.from_user),
        parse_mode='html')

@bot.message_handler(content_types=['text'])
def key(message):
      if message.text == '1':
        markup = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("1", callback_data='1')
        item2 = types.InlineKeyboardButton("2", callback_data='2')

        markup.add(item1, item2)

        bot.send_message(message.chat.id, "Выбирай:", reply_markup=markup)

    elif message.text == '2':
        markup = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("3", callback_data='3')
        item2 = types.InlineKeyboardButton("4", callback_data='4')

        markup.add(item1, item2)

        bot.send_message(message.chat.id, "Выбирай:", reply_markup=markup)

       else:
        sticker = open('files/wat.webp', 'rb')
        bot.send_sticker(message.chat.id, sticker)
    
        bot.send_message(message.chat.id, "Не найдено совпадений. Попробуй написать это сообщение по-другому.", parse_mode='html')

@bot.callback_query_handler(func=lambda call: True)
def zadanie(call):
    if call.data == '1':
        markup = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("№1", callback_data='st')

        markup.add(item1)

        bot.send_message(call.message.chat.id, "Выбирай:", reply_markup=markup)

        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Выбирай:", reply_markup=None)

        bot.answer_callback_query(callback_query_id=call.id, show_alert=False,
            text="Ты выбрал: 1")

#Что писать тут? 
    if call.data == 'st':
        st = open('files/st.jpg', 'rb')
        bot.send_photo(message.chat.id, st)

bot.polling(none_stop=True)
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
@twistfire92
Python backend developer
На эту строку не ругается?
bot.send_photo(message.chat.id, st)

Просто переменная message скорее всего не определена, так что попробуйте
bot.send_photo(call.message.chat.id, st)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sinneren
@sinneren
markup должен содержать keyboard, который содержит многомерный массив, где каждый массив - строка меню. мой пример на JS:
reply_markup: JSON.stringify({
            keyboard: [
                [messages.getPhoto],
                [messages.getEvents, messages.getHelp],
                [messages.getNews, messages.setRate]
            ],
            resize_keyboard: true,
            parse_mode: 'markdown'
        })
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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