• Почему не работает рандомайзер в telebot?

    Lord_of_Rings
    @Lord_of_Rings
    Python developer
    from random import randint
    
    @bot.message_handler(commands=['random'])
    def random(message):
      num = randint(0, 100)
      bot.send_message(message.chat.id, str(num))
    Ответ написан
    Комментировать
  • Почему не работает рандомайзер в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты из всего модуля random импортируешь только одну функцию random(), а использовать пытаешься random.randint(). Делай просто import random.
    Ответ написан
    Комментировать
  • Из за чего команда 9Abelora выполняется первее чем raspisanie?

    Vindicar
    @Vindicar
    RTFM!
    Изучай документацию, а не "уроки" с ютуба.
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
       ...

    func принимает функцию, которая должна по параметру call (сведения о нажатии кнопки) определить, будет ли данный обработчик обрабатывать это нажатие. Соответственно, функция вида lambda call: True всегда будет отвечать "да, я буду обабатывать!".

    При этом бот вызовет первый "согласившийся" обработчик, и ТОЛЬКО его. Как следствие, наличие одного обработчика с func=lambda call: True блокирует все нижележащие обработчики, так как этот "всеядный" обработчик будет брать на себя все нажатия кнопок (независимо от того, понимает ли он их). До остальных обработчиков дело просто не дойдёт.

    Чтобы это разрулить, надо прописывать не lambda call: True, а функцию, которая реально будет различать, какой набор кнопок у пользователя, и какая кнопка была нажата. Самый простой способ это сделать - сделать этакую иерархию в строке call.data. Например:
    9a.tomorrow
    9a.week
    9a.today
    10a.tomorrow
    10a.week
    10a.today

    Тогда ты сможешь прописать обработчики вида:
    @bot.callback_query_handler(func=lambda call: call.data.startswith('10a.'))
    def callback_inline_for_10a(call):
       ...  # тут обрабатываем кнопки для 10А
    
    @bot.callback_query_handler(func=lambda call: call.data.startswith('9a.'))
    def callback_inline_for_9a(call):
       ...  # тут обрабатываем кнопки для 9А


    Ну а создание кнопок, соответственно, будет иметь вид
    item1 = types.InlineKeyboardButton("Домашнее задание на завтра", callback_data='10a.tomorrow')
    Ответ написан
    4 комментария