Не работает 2-х уровневая клавиатура для тг бота

whatismean

Новичок
Пользователь
Фев 20, 2024
3
0
1
ОС: Windows 11
Python 3. 11. 8
pyTelegramBotAPI 4.15.2

Первая клавиатура выводится, но не реагирует на нажатие, просто бесконечно грузится, но ошибок не выдает, подскажите, в чем может заключаться проблема?
Заранее спасибо за ответы
Python:
# импортируем нужые библиотеки и модули
import telebot
from telebot import types
import random
import sqlite3 as sq
# инициализируем бота
bot = telebot.TeleBot('...')

# прописываем команды
# команда старт, начало работы с ботом
@bot.message_handler(commands=['start'])
def main(message):
    bot.send_message(message.chat.id, f'Привет,  {message.from_user.first_name}, это книжный бот KitBook и я помогу тебе подобрать книгу по вкусу!')

# переход к выбору жанра
@bot.message_handler(commands=['genres'])
def viev_genres(message):
        keyboard = types.InlineKeyboardMarkup()
        keyboard.add(types.InlineKeyboardButton("Ужасы", callback_data='scare'))
        keyboard.add(types.InlineKeyboardButton("Триллеры", callback_data='thriller'))
        keyboard.add(types.InlineKeyboardButton("Фантастика", callback_data='fiction'))
        keyboard.add(types.InlineKeyboardButton("Фэнтези", callback_data='fantasy'))
        keyboard.add(types.InlineKeyboardButton("Детективы", callback_data='detective'))
        keyboard.add(types.InlineKeyboardButton("Проза", callback_data='prose'))
        keyboard.add(types.InlineKeyboardButton("Классика", callback_data='classics'))
        keyboard.add(types.InlineKeyboardButton("Зарубежная классика", callback_data='forgeign classics'))
        bot.send_message(message.chat.id, 'Выбери любимый жанр:', reply_markup= keyboard)

@bot.callback_query_handler(func=lambda call: True)
def callback_keyboard(call):
    if call.data == 'scare':
        kb_scare = types.InlineKeyboardMarkup()
        kb_scare.add(types.InlineKeyboardButton("вариант 1", callback_data= 'test1'))
        kb_scare.add(types.InlineKeyboardButton("вариант 2", callback_data= 'test2'))
        bot.send_message(call.message.chat.id, "Выберите понравившееся произведение", reply_markup= kb_scare)
        
# команда для перехода к списку функций

@bot.message_handler(commands=['help'])
def main(message):
    bot.send_message(message.chat.id, 'Команда /start поможет тебе начать работу с ботом\nКоманда /book предложит тебе случайную книгу\nКоманда /random_genre предложит тебе список книг случайного жанра\nКоманда /genres покажет список доступных жанров\nКоманда /help вернет к списку команд')

# ответ на любое другое не предусмотренное сообщение
@bot.message_handler()
def info(message):
    bot.send_message(message.chat.id, 'Прости, я не знаю такой команы(')

bot.polling(none_stop=True, interval=0)
 

PYDEV

Пользователь
Пользователь
Авг 31, 2023
32
8
8
Спасибо за совет, но к сожалению не работает, все как было, не выводится
Вероятнее всего, надо сделать callback.answer()
И, вообще, по хорошему это надо переписать на aiogram. Я немного прикинулся, и сделал что-то такое:
Python:
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

bot = Bot(token="..")
dp = Dispatcher(bot=bot)

def get_books() -> InlineKeyboardMarkup:
    ikb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="Ужасы", callback_data="genre_scare")],
        [InlineKeyboardButton(text="Триллеры", callback_data="genre_thriller")],
        [InlineKeyboardButton(text="Фантастика", callback_data="genre_fiction")]
    ])
    
    return ikb

def ikb_select_part() -> InlineKeyboardMarkup:
    ikb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="1 вариант", callback_data="choice_1")],
        [InlineKeyboardButton(text="2 вараинт", callback_data="choice_2")]
    ])
    
    return ikb

@dp.message_handler(commands=["start"])
async def cmd_start(message: types.Message) -> None:
    await message.answer(f"Привет,  {message.from_user.first_name}, это книжный бот KitBook и я помогу тебе подобрать книгу по вкусу!")

@dp.message_handler(commands=["genres"])
async def select_book(message: types.Message) -> None:
    await message.answer(
        text="Выбирай понравившийся жанр👇",
        reply_markup=get_books()     
        )

@dp.callback_query_handler(lambda callback_query: callback_query.data.startswith("genre_"))
async def select_part(callback: types.CallbackQuery) -> None:
    await bot.send_message(
        chat_id=callback.from_user.id,
        text="Выбери понравившийся вариант:",
        reply_markup=ikb_select_part()
    )
    await callback.answer()

@dp.callback_query_handler(lambda callback: callback.data == "choice_1")
async def send_book(callback: types.CallbackQuery) -> None:
    await bot.send_message(
        chat_id=callback.from_user.id,
        text=f"Ты выбрал {callback.data}\n" \
             f"Сейчас отправлю книгу..."
    )
    await callback.answer()

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)
Ну и конечно, это всё надо разбить на файлы... Вынести функции для создания клавы в какой ни будь keyboards.py
 
  • Мне нравится
Реакции: 4olshoy_blen

PYDEV

Пользователь
Пользователь
Авг 31, 2023
32
8
8
@bot.callback_query_handler(func=lambda call: True)
->
@bot.callback_query_handler(lambda c: c.data == "scare")
хз, попробуй
 

whatismean

Новичок
Пользователь
Фев 20, 2024
3
0
1
@bot.callback_query_handler(func=lambda call: True)
->
@bot.callback_query_handler(lambda c: c.data == "scare")
хз, попробуй
Спасибо за совет, но к сожалению не работает, все как было, не выводится
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
374
108
43
Ну и конечно, это всё надо разбить на файлы... Вынести функции для создания клавы в какой ни будь keyboards.py
а также указать, что это для версии aiogram 2.x
 
  • Мне нравится
Реакции: PYDEV

Форум IT Специалистов