@M_shumey

Как в боте telebot продолжать цикл после ответа пользователя, нажатием на кнопку инлайн?

Нужно чтобы бот переходил на следующий вопрос только после нажатия пользователя на инлайн кнопку с правильным ответом. мой код:
import telebot
import random
import csv
from telebot import types
from random import shuffle
    
            # Создаем экземпляр бота
bot = telebot.TeleBot(ТОКЕН)
            # Загружаем список вопросов
qestions = []
q_list = []
with open('data/qestions.csv') as q:
    QS = csv.reader(q)
    qestions=list(QS)
    a=str(qestion).split(';')
shuffle(q_list)
quan=len(q_list)
    
            #приветсвие и запуск теста
@bot.message_handler(commands=["start"])
def get_text_messages(message, res=False):
    keyboard = types.InlineKeyboardMarkup();
    key_begin = types.InlineKeyboardButton(text="Начнем", callback_data='begin'); 
    keyboard.add(key_begin);
    bot.send_message(message.from_user.id, text="Привет, я Бот-тест", reply_markup=keyboard)
    
numr=0
@bot.callback_query_handler(func=lambda call: True)
def reg(call):
if call.data == 'begin':
    numq=1    
    for q in q_list:
        if q[1]!="": 
            sti = open(q[1], 'rb')
            bot.send_sticker(call.from_user.id, sti)
        else: pass
    
        keyboard = types.InlineKeyboardMarkup(); #наша клавиатура
    
        key_ans1 = types.InlineKeyboardButton(text=q[3], callback_data='trye'); #кнопка ответ 1
        keyboard.add(key_ans1); #добавляем кнопку в клавиатуру
    
        key_ans2= types.InlineKeyboardButton(text=q[4], callback_data='false'); #кнопка ответ 2
        keyboard.add(key_ans2);
    
        key_ans3= types.InlineKeyboardButton(text=q[5][:-1], callback_data='false'); #кнопка ответ 3
        keyboard.add(key_ans3);
    
        bot.send_message(call.from_user.id, text="Вопрос №" + str(numq) +": \n" + q[2], reply_markup=keyboard)
        numq=numq+1
        if call.data == 'trye':                 
            global numr
            bot.answer_callback_query(call.id)
            bot.send_message(call.from_user.id, 'Правильный ответ!')
            numr=numr+1
            bot.send_message(call.from_user.id, text='Правильных ответов:' + str(numr))
    
#сообщение о неправильном ответе
@bot.callback_query_handler(func=lambda c: c.data == 'false')
def process_callback_wrong(callback_query: types.CallbackQuery):
    bot.answer_callback_query(callback_query.id)
    bot.send_message(callback_query.from_user.id, 'Ответ неверный')
    
bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 443 просмотра
Решения вопроса 1
@ragq1991
1. Вынести отправку следующего вопроса в отдельную функцию.
2. Если я правильно понимаю декоратор "@bot.callback_query_handler(func=lambda call: True)" будет отрабатывать по правильному ответу, а он у Вас над функцией которая проверяет нажал ли пользователькнопку "begin". Здесь значится нужно изменить декоратор на что-то типа "@bot.callback_query_handler(func=lambda c: c.data == 'begin')" и должен произойти первый вызов функции отправки нового вопроса.
3. Далее две функции с декораторами "@bot.callback_query_handler(func=lambda c: c.data == 'False')" и "@bot.callback_query_handler(func=lambda c: c.data == 'True')" коорые соотвественно возвращают пользователю или сообщение что он ответил неверно или новый вопрос(под декоратором True вызов функции отправки следующего вопроса).

Надеюсь понятно написал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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