Генератор inline-кнопок в Telegram боте
У меня возникла необходимость генерировать инлайн кнопки исходя из данных списка типа: "запеканка, сырники, яичница"
@bot.message_handler(regexp="Готово")
def done(message):
data = (open('/Users/user/Desktop/CODE/rbot/data/%s.txt' % user, 'r')).readline() #тут создается файл с id пользователя
choice = data.split()
recipes = open('/Users/user/Desktop/CODE/rbot/data/recipe_key.txt', 'r').readlines() # файл с ключами к вабранным ингредиентам и в следующей строке названия возможных блюд из этих ингредиентов
for index, line in enumerate(recipes):
if choice == line.split():
# тут просто кнопки клавиатуры
markup_reply = types.ReplyKeyboardMarkup(resize_keyboard = True)
item_choise = types.KeyboardButton('Выбрать другие продукты')
item_next = types.KeyboardButton('Выбрать готовый рецепт')
markup_reply.add(item_choise, item_next)
# в тестовом режиме выводятся названия возможных рецептов строкой в сообщении (recipes[index+1])
bot.send_message(message.chat.id, recipes[index+1], reply_markup = markup_reply)
erase = (open('/Users/artamonov/Desktop/CODE/rbot/data/%s.txt' % user, 'w'))
erase.close() # чистим файл
generateButton = recipes[index+1].split()
generateindex = recipes[index+2].split()
keyboard = types.InlineKeyboardMarkup()
# далее нужно сгенерировать кнопки по подобию button_0
for item in generateButton: #цикл который будет генерировать...
button_0 = types.InlineKeyboardButton(text='%s' %generateButton[0], callback_data= '%s' %generateindex[0])
keyboard.add(button_0, button_1, ...) # сюда нужно получить имена всех сгенерированных кнопок
bot.send_message(message.chat.id, "Выберете основные ингредиенты:", reply_markup=keyboard)
Ответы (3 шт):
Автор решения: shalor1k
→ Ссылка
Попробуйте так:
@bot.message_handler(content_types=["text"])
def default_test(message):
keyboard = types.InlineKeyboardMarkup()
button_first = types.InlineKeyboardButton(text="Запеканка", callback_data="Запеканка")
button_second = types.InlineKeyboardButton(text="Сырники", callback_data="Сырники")
button_third = types.InlineKeyboardButton(text="Яичница", callback_data="Яичница")
keyboard.add(button_first,button_second, button_third )
bot.send_message(message.chat.id, "Привет! Нажми на кнопку и получишь рецепт.", reply_markup=keyboard)
Автор решения: Dmitry Artamonov
→ Ссылка
3 дня бился с проблемой и нашел решение:
markup_reply = types.ReplyKeyboardMarkup(resize_keyboard = True)
item_choise = types.KeyboardButton('Выбрать другие продукты')
item_next = types.KeyboardButton('Выбрать готовый рецепт')
markup_reply.add(item_choise, item_next)
bot.send_message(message.chat.id, recipes[index+1], reply_markup = markup_reply)
erase = (open('.../CODE/rbot/data/%s.txt' % user, 'w'))
erase.close()
generateButton = recipes[index+1].split()
generateindex = recipes[index+2].split()
try: # количество кнопок каждый раз разное, а генерировать переменные кнопок я не умею и не уверен что вообще возможно. Поэтому я заготовил 12 на всякий случай. Через try-except ошибки возникать не будут.
keyboard = types.InlineKeyboardMarkup()
button_0 = types.InlineKeyboardButton(text='%s' %generateButton[0], callback_data= '%s' %generateindex[0])
button_1 = types.InlineKeyboardButton(text='%s' %generateButton[1], callback_data= '%s' %generateindex[1])
button_2 = types.InlineKeyboardButton(text='%s' %generateButton[2], callback_data= '%s' %generateindex[2])
button_3 = types.InlineKeyboardButton(text='%s' %generateButton[3], callback_data= '%s' %generateindex[3])
button_4 = types.InlineKeyboardButton(text='%s' %generateButton[4], callback_data= '%s' %generateindex[4])
button_5 = types.InlineKeyboardButton(text='%s' %generateButton[5], callback_data= '%s' %generateindex[5])
button_6 = types.InlineKeyboardButton(text='%s' %generateButton[6], callback_data= '%s' %generateindex[6])
button_7 = types.InlineKeyboardButton(text='%s' %generateButton[7], callback_data= '%s' %generateindex[7])
button_8 = types.InlineKeyboardButton(text='%s' %generateButton[8], callback_data= '%s' %generateindex[8])
button_9 = types.InlineKeyboardButton(text='%s' %generateButton[9], callback_data= '%s' %generateindex[9])
button_10 = types.InlineKeyboardButton(text='%s' %generateButton[10], callback_data= '%s' %generateindex[10])
button_11 = types.InlineKeyboardButton(text='%s' %generateButton[11], callback_data= '%s' %generateindex[11])
except:
pass
for i, item in enumerate(generateindex):
f = 'button_' + str(i)
keyboard.add(eval(f)) # тут и было решение: генерируем строковые названия переменных кнопок и через eval запихиваем их как аргументы добавленной клавиатуры.
bot.send_message(message.chat.id, 'Привет', reply_markup=keyboard)
Автор решения: Dmitry Savchenko
→ Ссылка
Можно так попробовать:
list_button_name = ['button 1', 'button 2', 'button 3', 'button 4']
buttons_list = []
for item in list_button_name:
buttons_list.append([InlineKeyboardButton(text=item, callback_data=item)])
keyboard_inline_buttons = InlineKeyboardMarkup(inline_keyboard=buttons_list)