@Helig

Как сделать последовательное появление кнопок python-telegram-bot?

Мне нужно сделать следующее:
По команде появляется кнопка *На неё нажимают* => Появляется следующая кнопка со своими обозначениями.
Что у меня уже есть:
import requests
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InputTextMessageContent, ParseMode
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler, InlineQueryHandler
import logging

***

def button(bot, update):
    query = update.callback_query
    query.edit_message_text(text="Выбран номер: {}".format(query.data))
def use(bot, update):
    keyboard = [[InlineKeyboardButton("1", callback_data='1')],
                [InlineKeyboardButton("2", callback_data='2')],
                [InlineKeyboardButton("3", callback_data='3')],
                [InlineKeyboardButton("4", callback_data='4')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text('Пожалуйста выберите:', reply_markup=reply_markup)

***

 def main():

     dp.add_handler(CommandHandler("use", use))
     dp.add_handler(CallbackQueryHandler(button))
if __name__ == '__main__':
    main()
  • Вопрос задан
  • 1662 просмотра
Пригласить эксперта
Ответы на вопрос 1
@AndrewPythonBuilder
Новичок Питонист
Доброго времени суток!
Предыстория.
Мне недавно дали задание сделать бота опросника. Я понятия не имел, как его сделать, единственное, что я умел на тот момент - пользоваться бд и создавать обычные кнопки. Поэтому и придумал такой немного кривой способ:
1) создаем строку, в которой будет содержаться весь путь наших вопросов и ответов на них, разделяя такими знаками, которые никогда(возможно) не встретятся у вас в сообщениях. Например есть у вас вопрос "Сколько вам лет?" и предполагаемые ответы: "2", "10", "22".
И мы записываем их в строку <<Сколько вам лет?№№№№2$$$10$$$22^^^^^>>
Знаками '^^^^^' мы отделяем вопросы.
Знаками '№№№№' отделяем вопрос от предполагаемых ответов и '$$$' разделяет предполагаемые ответы
2) Логично, что при создании вопроса мы сплитуем эту строку, и callback_data присваиваем номер вопроса. Чтобы ориентироваться по нашей строке.

Вот код создание вопроса:
elif message.text == 'Опрос':
        opros = True
        bot.send_message(message.chat.id, 'Напишите текст опроса')
elif opros == True:
        opros  = False
        text = message.text
        bot.send_message(message.chat.id, 'Все ответы через $$$')
        opros1 = True
elif opros1 == True:
            opros1 = False
            answers = message.text.split('$$$')
            bottons = []
            for i in range(len(answers)):
                botton = [InlineKeyboardButton(answers[i], callback_data='sale+' + answers[i])] 
                bottons.append(botton)
            reply_markup = InlineKeyboardMarkup(bottons)
            bot.send_message(message.chat.id, text=text, reply_markup=reply_markup)
            base_w.save(text + '№№№№' + message.text + '^^^^') #сохраняем в бд
            message.text = 'Опрос'
            answer_questions(bot, update) #запускаем заново

Это код инициализации опроса:
elif message.text == 'Инициализация':
        l = base_w.upload() #достаем из бд нашу строку
        te = l.split('^^^^')
        I = 0 # создаем счетчик
        u = te[I].split('№№№№') #делим вопрос и ответы
        text = u[0]
        answers = u[-1].split('$$$')
        bottons = []
        for i in range(len(answers)):
            botton = [InlineKeyboardButton(answers[i], callback_data=str(I) + '+' + answers[i])] # важная часть, где мы callback_data присваиваем номер вопроса
            bottons.append(botton)
        reply_markup = InlineKeyboardMarkup(bottons)
        bot.send_message(message.chat.id, text=text, reply_markup=reply_markup)


И функция обработчика:
def button(bot, update):
    I = int(str((query.data).split('+')[0])) + 1 #увеличиваем счетчик
    l = base_w.upload()
    te = l[-2].split('^^^^')
    # и повторяем...


Если что-то не понятно, или просто код нужно будет скинуть, напиши в telegram @andrew_2046
Удачи!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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