Не могу понять почему не работает callback_query_handler, у меня нет опыта в этом, помогите пж. python telebot
bot = telebot.TeleBot(token)
proverka = 0
@bot.message_handler(commands=['start', 'help'])
def start(message):
global proverka
bot.send_message(message.chat.id, 'Привет!')
proverka = 0
game(message)
def game(message):
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Угадай число', callback_data='угадай'))
markup.add(telebot.types.InlineKeyboardButton(text='Реши за 2 секунды', callback_data='реши2'))
bot.send_message(message.chat.id, text="Выберите игру: ", reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def ans(call):
message = call.message
global proverka
if proverka == 0:
if call.data == 'угадай':
bot.register_next_step_handler(message, go1)
elif proverka == 1:
if call.data == 'да':
ram = randint(0,2)
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='0', callback_data='0'))
markup.add(telebot.types.InlineKeyboardButton(text='1', callback_data='1'))
markup.add(telebot.types.InlineKeyboardButton(text='2', callback_data='2'))
bot.send_message(call.message.chat.id, text="Какое число я загадал?", reply_markup=markup)
proverka = 2
if proverka == 2:
if call.data == ram:
bot.send_message(call.message.chat.id, 'Правильно!')
else:
bot.send_message(call.message.chat.id, 'Неправильно, попробуйте еще раз! \nУ вас получится!')
def go1(message):
global proverka
proverka = 1
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Да', callback_data='да'))
markup.add(telebot.types.InlineKeyboardButton(text='Нет',callback_data='нет'))
bot.send_message(message.chat.id, text="Готов?", reply_markup=markup)
Ответы (1 шт):
Вот вам код, который я немного переделал, сейчас я вам все объясню, что да как
bot = telebot.TeleBot(token)
@bot.message_handler(commands=['start', 'help'])
def start(message):
bot.send_message(message.chat.id, 'Привет!')
game(message)
def game(message):
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Угадай число', callback_data='угадай'))
markup.add(telebot.types.InlineKeyboardButton(text='Реши за 2 секунды', callback_data='реши2'))
bot.send_message(message.chat.id, text="Выберите игру: ", reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def ans(call):
ram = randint(0,2)
if call.data == 'угадай':
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Да', callback_data='да'))
markup.add(telebot.types.InlineKeyboardButton(text='Нет',callback_data='нет'))
bot.send_message(call.message.chat.id, text="Готов?", reply_markup=markup)
if call.data == 'да':
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='0', callback_data='0'))
markup.add(telebot.types.InlineKeyboardButton(text='1', callback_data='1'))
markup.add(telebot.types.InlineKeyboardButton(text='2', callback_data='2'))
bot.send_message(call.message.chat.id, text="Какое число я загадал?", reply_markup=markup)
if call.data == '0':
if ram == 0:
bot.send_message(call.message.chat.id, 'Правильно!')
else:
bot.send_message(call.message.chat.id, 'Неправильно, попробуйте еще раз! \nУ вас получится!')
if call.data == '1':
if ram == 1:
bot.send_message(call.message.chat.id, 'Правильно!')
else:
bot.send_message(call.message.chat.id, 'Неправильно, попробуйте еще раз! \nУ вас получится!')
if call.data == '2':
if ram == 2:
bot.send_message(call.message.chat.id, 'Правильно!')
else:
bot.send_message(call.message.chat.id, 'Неправильно, попробуйте еще раз! \nУ вас получится!')
Первое на что я хочу обратить ваше внимание, это отсутствие proverka = 0 и всего что к нему идет, так как на меня это не нужная проверка, и она здесь вообще не нужно, так как call.data и сама справляется
Дальше я к каждой кнопке сделал свою callback_data что бы проверять, правильно ли сделан выбор игроком:
if call.data == '0':
if call.data == '1':
if call.data == '2':
Следующий момент, я убрал
def go1(message):
global proverka
proverka = 1
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Да', callback_data='да'))
markup.add(telebot.types.InlineKeyboardButton(text='Нет',callback_data='нет'))
bot.send_message(message.chat.id, text="Готов?", reply_markup=markup)
так-как из-за него бот ждет не нужный текст, и заменил эти кнопки на прямую к кнопке "угадай"
Что-бы не выдавало ошибки local variable 'ram' referenced before assignment переместил ram = randint(0,2) выше по коду
Еще можно избавиться от функции def game(message), но это уже если вы сами захотите(если что, код будет такой):
@bot.message_handler(commands=['start', 'help'])
def start(message):
bot.send_message(message.chat.id, 'Привет!')
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Угадай число', callback_data='угадай'))
markup.add(telebot.types.InlineKeyboardButton(text='Реши за 2 секунды', callback_data='реши2'))
bot.send_message(message.chat.id, text="Выберите игру: ", reply_markup=markup)
По-сути оно будет делать тоже самое Надеюсь смог вам помочь =)