Угадайка позади, и ты уже умеешь главное: бот помнит и считает. Соберём из этого квиз. Бот задаёт вопросы с вариантами, проверяет ответ и ведёт счёт. Таким ботом реально хочется поделиться: сделай квиз по любимой игре, по своему классу, по фильму.
После урока сможешь: объяснить тему «Храним вопросы: список словарей» и выполнить связанный с ней учебный шаг без подсказки.
Большой бот пишется по кусочкам. Сегодня первый кусок: как красиво хранить вопросы и показать один из них с кнопками.
Один вопрос это словарь
У каждого вопроса три части: текст, варианты ответа и какой из них верный. Это просится в словарь, пары «ключ значение»:
{"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"}
Читается как анкета. Поле text это сам вопрос, varianty это список ответов, otvet это правильный.
Много вопросов это список словарей
Вопрос не один, значит сложим их в список. Получится список словарей: каждый элемент это один вопрос-анкета.
voprosy = [
{"text": "Какой тег задаёт заголовок в HTML?", "varianty": ["<h1>", "<p>", "<a>"], "otvet": "<h1>"},
{"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"},
{"text": "На каком языке мы пишем ботов?", "varianty": ["Python", "Java", "C++"], "otvet": "Python"},
]
Красота в том, что добавить вопрос проще простого: дописал ещё один словарь в список, и всё. Код трогать не надо. Достать нужное легко: voprosy[0] это первый вопрос, voprosy[0]["text"] это его текст, voprosy[0]["varianty"] это список его вариантов.
Показываем вопрос с кнопками
Покажем первый вопрос, а варианты сделаем inline-кнопками из Модуля 2. Каждая кнопка это один вариант:
import telebot
from telebot import types
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
voprosy = [
{"text": "Какой тег задаёт заголовок в HTML?", "varianty": ["<h1>", "<p>", "<a>"], "otvet": "<h1>"},
{"text": "Сколько бит в одном байте?", "varianty": ["4", "8", "16"], "otvet": "8"},
{"text": "На каком языке мы пишем ботов?", "varianty": ["Python", "Java", "C++"], "otvet": "Python"},
]
@bot.message_handler(commands=['start'])
def start(message):
vopros = voprosy[0]
keyboard = types.InlineKeyboardMarkup()
for variant in vopros["varianty"]:
keyboard.add(types.InlineKeyboardButton(variant, callback_data=variant))
bot.send_message(message.chat.id, vopros["text"], reply_markup=keyboard)
bot.infinity_polling()
Главное тут цикл for variant in vopros["varianty"]. Он проходит по списку вариантов и на каждый делает кнопку. Три варианта, три кнопки. callback_data=variant кладёт в метку сам текст варианта, чтобы потом понять, что нажали.
Контрольный вопрос. Один вопрос квиза хранят в словаре с ключами text, varianty и ещё одним — с правильным ответом. Напиши этот третий ключ.
Подсказка: {«text»:…, «varianty»:…, «____»:…}
Онлайн-проверка ответа появится позже
Задание. Сделай список voprosy из 3-5 своих вопросов на свою тему и покажи первый вопрос с вариантами-кнопками на /start. Пришли скриншот, где бот показывает вопрос и кнопки.
Подсказка: Каждый вопрос — словарь с полями text, varianty, otvet. Кнопки строй циклом по varianty.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Зачёт, если:
✅ список voprosy из 3-5 своих вопросов готов;
✅ на /start бот показывает первый вопрос с кнопками-вариантами;
✅ прислан скриншот вопроса и кнопок.
