remberq
@remberq
Пытаюсь понять, что такое это ваше IT

Inline кнопки в Telegram в чем загадка?

Не могу разобраться почему в одном случае работают инлайн кнопки, а в другом нет.
Наверное вопрос банальный, я только разбираюсь во всем этом, поэтому буду рад наводке!
Не рабочий вариант
from aiogram import types, Dispatcher
from aiogram.dispatcher.filters import Text


from keys.keying import game_keys


# @dp.message_handler(commands='game')
async def start_game(message: types.Message):
    await message.answer('Выберите!', reply_markup=game_keys)
    await message.delete()


# @dp.callback_query_handler(Text(startswith='word_'))
async def game_callback(call: types.CallbackQuery):
    await call.message.answer(f'Вы выбрали {call.data.split("_")[1]}')
    await call.message.delete()
    await call.answer()


def register_handlers_client(dp: Dispatcher):
    dp.register_message_handler(start_game, commands='game')
    dp.callback_query_handler(game_callback, Text(startswith='word_'))

Рабочий вариант
from aiogram import types, Dispatcher
from aiogram.dispatcher.filters import Text


from keys.keying import game_keys


@dp.message_handler(commands='game')
async def start_game(message: types.Message):
    await message.answer('Выберите!', reply_markup=game_keys)
    await message.delete()


@dp.callback_query_handler(Text(startswith='word_'))
async def game_callback(call: types.CallbackQuery):
    await call.message.answer(f'Вы выбрали {call.data.split("_")[1]}')
    await call.message.delete()
    await call.answer()


def register_handlers_client(dp: Dispatcher):
    dp.register_message_handler(start_game, commands='game')
    dp.callback_query_handler(game_callback, Text(startswith='word_'))

Разница между ними только в декораторах которые я закоментил в нерабочем варианте.
С обычными кнопками работает такая схема, но с инлайн почему-то работает только при декораторах.
Сами кнопки появляются, но при нажатии на них не срабатывает CallbackQuery.

Старт бота
from logic.config import dp
from aiogram.utils import executor
from logic.game import register_handlers_client


register_handlers_client(dp)


executor.start_polling(dp, skip_updates=True)


config
from aiogram import Bot
from aiogram import Dispatcher


bot = Bot(token='TOKEN')
dp = Dispatcher(bot)</spoiler>


keying
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton


nouns = InlineKeyboardButton(text='существительное', callback_data='word_nouns')
verb = InlineKeyboardButton(text='глагол', callback_data='word_verb')
adverbs = InlineKeyboardButton(text='наречие', callback_data='word_adverbs')
adjectives = InlineKeyboardButton(text='прилагательное', callback_data='word_adjectives')


game_keys = InlineKeyboardMarkup(row_width=2)
game_keys.add(nouns).add(adverbs).add(verb).add(adjectives)
  • Вопрос задан
  • 954 просмотра
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Инлайн кнопки не работают, потому что не привязали никакую функцию к нажатию. Все привязки функций к событиям могут осуществляться двумя способами
1. Использование декоратора
2. Использование специальной функции

Обычные кнопки у вас работают потому что использовали второй вариант и вызвали специальную функцию register_*_handler, в то время как для инлайн кнопки вызвали обычную функцию, которая должна являться декоратором.

Если хочется зарегистрировать хендлер через функцию - велком
register_callback_query_handler()

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

https://docs.aiogram.dev/en/latest/dispatcher/inde...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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