Как добавить в Телеграм боте блок из 5 строк и 5 кнопок?

Как я могу преобразовать мой код так, чтобы при нажатии кнопки "легкий_Уровень" выводилось 25 инлайн кнопок 5 х 5, а не списком по-вертикали? Мой код сейчас выводит кнопки списком по-вертикали.
  • 30 декабря 2023 г. 15:47
Ответы на вопрос 2
Для вывода кнопок в виде блока 5 строк и 5 кнопок, вам нужно использовать клавиатуру `InlineKeyboardMarkup` и добавить кнопки в соответствующие ряды.

Вот пример кода, который поможет вам реализовать это:

```python
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Updater, CommandHandler, CallbackContext, CallbackQueryHandler

def start(update: Update, context: CallbackContext):
    keyboard = []
    buttons_per_row = 5
    rows = 5

    for i in range(rows):
        button_row = []
        for j in range(buttons_per_row):
            button_row.append(InlineKeyboardButton(f"Кнопка {i*buttons_per_row + j}", callback_data=f"button_{i*buttons_per_row + j}"))
        keyboard.append(button_row)

    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text('Выберите кнопку:', reply_markup=reply_markup)

def button_click(update: Update, context: CallbackContext):
    query = update.callback_query
    button_number = int(query.data.split('_')[1])
    query.answer(f"Вы нажали кнопку номер {button_number}")

updater = Updater('YOUR TOKEN HERE', use_context=True)
dispatcher = updater.dispatcher

dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CallbackQueryHandler(button_click))

updater.start_polling()
```

В этом примере мы создаем клавиатуру `InlineKeyboardMarkup` с 5 строками и 5 кнопками в каждой. Затем мы добавляем кнопки в каждый ряд с помощью вложенных циклов. При нажатии на любую кнопку будет вызываться функция `button_click`, которая отправляет ответ с номером нажатой кнопки.

Не забудьте заменить `'YOUR TOKEN HERE'` на ваш токен бота в строке `updater = Updater('YOUR TOKEN HERE', use_context=True)`.
@bot.callback_query_handler(func=lambda call: True)
def handle_callback_query(call):
    if call.data == 'learn_words':
        markup = types.InlineKeyboardMarkup(row_width=2)
        button1 = types.InlineKeyboardButton("Легкий уровень", callback_data='easy_level')
        button2 = types.InlineKeyboardButton("Дом и быт", callback_data='home_and_life')
        markup.add(button1, button2)

        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                              text="Отлично! Выберите какие слова вы будете изучать", reply_markup=markup)

    elif call.data == 'easy_level':
        markup = types.InlineKeyboardMarkup(row_width=5)
        row = []
        for i in range(1, 26):
            button = types.InlineKeyboardButton(str(i), callback_data=f'word_{i}')
            row.append(button)
            if len(row) == 5:
                markup.row(*row)
                row = []

        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                              text="Выберите слово:", reply_markup=markup)

    elif call.data.startswith('word_'):
        selected_word = call.data.split('_')[1]
        bot.send_message(call.message.chat.id, f"Вы выбрали слово {selected_word}")
Похожие вопросы