Обновить
2
0

Пользователь

Отправить сообщение

Как по мне он значительно сложнее чем pytelegrambotapi, и далеко не все хотят в нём разбираться, мне кажется что в простых ботах нет необходимости в aiogram.

Вот что-то подобное для списка:

import telebot

bot = telebot.TeleBot('YOUT_TOKEN')

# список языков
languages = ['русский', 'английский', 'немецкий', 'очень много языков', 'другие языки', 'ещё языки']
# я поставлю два на страницу, мне лень много перечеслять

@bot.message_handler(commands=['start'])
def start_command(message):
    keyboard = get_keyboard(0, languages, 2)  # первая страница с двумя языками
    # меню где нужно выбрать
    bot.send_message(message.chat.id, 'привет, выбери язык:', reply_markup=keyboard)


def get_keyboard(index, list_of_languages, languages_in_page):
    languages_on_page = languages[index:index+languages_in_page]
    print(languages_on_page)
    print(index)
    keyboard = telebot.types.InlineKeyboardMarkup(row_width=2) # замени взависимости от размера текста
    for language in languages_on_page:
        print(language)
        keyboard.add(telebot.types.InlineKeyboardButton(text=language, callback_data=language+"_"+"language_choose"))

    row = []
    if index > 0:
        row.append(telebot.types.InlineKeyboardButton(text='назад', callback_data='prev'+"_"+str(index-languages_in_page)))

    if len(list_of_languages) > index + languages_in_page:
        row.append(telebot.types.InlineKeyboardButton(text='далее', callback_data='next'+"_"+str(index+languages_in_page)))

    keyboard.row(*row)
    return keyboard

@bot.callback_query_handler(func=lambda call: 'next' in call.data)
def next_page(call: telebot.types.CallbackQuery) -> None:
    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=get_keyboard(int(call.data.split('_')[1]), languages, 2))

@bot.callback_query_handler(func=lambda call: 'prev' in call.data)
def next_page(call: telebot.types.CallbackQuery) -> None:
    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=get_keyboard(int(call.data.split('_')[1]), languages, 2))


@bot.callback_query_handler(func=lambda call: 'language_choose' in call.data)
def language_choose(call: telebot.types.CallbackQuery) -> None:
    bot.send_message(call.message.chat.id, f'Вы выбрали язык: {call.data.split("_")[0]}')

    
bot.polling()

получается что-то такое:

насчёт инлайн ботов не уверен, я никогда не сталкивался и вообще не уверен что такое возможно в telebot.

Не совсем понял, для выбора из большого списка можно использовать инлайн клавиатуру, или если он очень большой обозначаешь каждое значение числом, вот так например
1) выбор 1

2) выбор 2
и дальше запрашиваешь у пользователя число.
А что вы подразумеваете под деревом я не понял, можете уточнить?

словарь states = {user_id: "state"}, user_id: int, а стейт - строка, и далее в хендлере сверять с каждым возможным и вызываю соответствующую функцию, например if states[message.from_user.id] == "test": test(message), также можно создавать пустые класс как состояния, но тогда как по мне легче второй способ использовать.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность