Задать вопрос
@i_ikigai

Есть список фильмов, как в телеграме выводить по кнопке каждые 10, 20, 30 и тд фильмов, aiogram?

При нажатии на кнопку "все" выходят кнопки, типо на 1 будут первые 10 фильмов, на 2 20 фильмов и тд
@dp.callback_query_handler(lambda c: c.data == 'все')
async def callback_inline(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    key1 = InlineKeyboardMarkup() # тут будут кнопки в зависимости от колва фильмов
    for key in handlers.user_films_all():
        rele1 = InlineKeyboardButton(text=f"{key}", callback_data=f"{key}")
        key1.row(rele1)
    await bot.edit_message_text(chat_id=callback_query.from_user.id, message_id=callback_query.message.message_id,
                                text=f'На цифраx будут фильмы', reply_markup=key1)

Тут я создаю словарь с "цифрой" и значением - списком фильмов
def user_films_all():
    db = sql.connect('TGusers_films.db')
    cur = db.cursor()
    array = list(cur.execute('SELECT name_film, year_films FROM user_films'))
    result = list(chunks(3, array))# для примера тут по 3
    ord_dict = OrderedDict()
    for i in enumerate(result, 1):
        ord_dict[f'{i[0]}'] = i[1]

    return ord_dict

Вот как нужно написать код, чтобы он подхватил цифры из callback_data и выводил список фильмов а не писать для цифер в ручную?
@dp.callback_query_handler(lambda c: c.data == '1') # потом 2, 3, 4 и тд
async def process_callback_button1(callback_query: types.CallbackQuery):
    number = callback_query.data
    await bot.answer_callback_query(callback_query.id)
    keys = InlineKeyboardMarkup(resize_keyboard=True)
    for key in handlers.user_films_all().keys():
        rele1 = InlineKeyboardButton(text=f"{key}", callback_data=f"{key}")
        keys.row(rele1)
    await bot.edit_message_text(chat_id=callback_query.from_user.id, message_id=callback_query.message.message_id,
                                text=f'{handlers.nubmer_exit(number)}',
                                reply_markup=keys)

то есть чтобы не нужно было писать каждому коллбеку кусок кода?
  • Вопрос задан
  • 342 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@i_ikigai Автор вопроса
Не знаю правильно ли так писать, но всё работает
amount_keys = handlers.col()  # количество кнопок


@dp.callback_query_handler(lambda c: f"{amount_keys}")
async def process_callback_button1(callback_query: types.CallbackQuery):
    number = callback_query.data
    await bot.answer_callback_query(callback_query.id)
    keys = InlineKeyboardMarkup(resize_keyboard=True)
    for key in handlers.user_films_all().keys():
        number_button = InlineKeyboardButton(text=f"{key}", callback_data=f"{key}")
        keys.insert(number_button)
    await bot.edit_message_text(chat_id=callback_query.from_user.id, message_id=callback_query.message.message_id,
                                text=f'{handlers.nubmer_exit(number)}',
                                reply_markup=keys)


Функция для количества кнопок
def col():
    s = len(user_films_all())
    o = 'or'
    res = ["c.data == '1'"]


    for i in range(2, s+1):
        if i == s:
            res.append(o)
            res.append(f'c.data = "{i}"')
        else:
            res.append(o)
            res.append(f'c.data = "{i}"')
    r = " ".join(res)
    return r
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@c00re
Можно в список засунуть фильмы,после нажатия на кнопку получаете callback и делаете срез.5f2abfcae54f7435040725.png
Это скриншот из моего бота.Если человек жмёт на 10,то я делаю
listOfFilms = [:10] #Пример
и получаю список из 10 первых фильмов
Ответ написан
Ваш ответ на вопрос

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

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