Как сделать программу для тестирования с самостоятельным созданием тестов?

Хочу создать программу которая будет проводить тестирования и при этом каждый мог сам составить тест. Но как это реализовать не знаю. Какие способы есть. Графику сделаю на фреймворке PyQt5.

Как я это вижу. Для самостоятельного составление тестов можно в файл .txt делать записи следующим образом:

[vopros]Вопрос 1[vopros]
[v1]Вариант ответа 1[v2]

и тд. После чего основная программа как то читает данную запись и создает отдельное окно с таким тестом и вариантами ответов.


Ответы (2 шт):

Автор решения: Вадим Мельников

Можно билдить например в xml формате

<question>
<description>Text</description>
<false>answer 1</false>
<false>answer 2</false>
<true>answer 3</true>
<false>anser 4<false>
</question>

Из преимуществ подобного решения, это возможность удобно билдить вопросы из разного количества вариантов ответов и количества правильных ответов.

→ Ссылка
Автор решения: Alexander Chernin

Можно использовать xml, а можно, например, json, что может быть удобнее, но это дело вкуса

Создаете файл json, допустим вот такого вида:

{
    "q": [ // Опросник "q"
        { // Первый вопрос с id = 0
            "id": 0,
            "text": ""  // Текст вопроса        
            "vars": [ // Варианты ответов
                { // Вариант 1 с id = 1
                    "id": 1
                    "txt": "..." // Текст ответа
                },
                { // Вариант 2 
                    "id": 2
                    "txt": "..."
                },
                ...
            ],
            "ans": [2, 3] // id правильных ответов 
            // (id - потому что вы можете изменять последовательность 
            // вариантов ответов и, при этом, не придется править сам массив ответов)
        },
        { // Второй вопрос и так далее
          ...
        }
    ]
}

Здесь, если ans имеет длину 1, то правильный вариант, соответственно, один, а если длина больше 1, то (драматическая пауза) и правильных ответов пользователь может выбрать несколько.

Весь код за вас я, естественно, писать не буду, но он не сложный и выглядит приблизительно так (крупными мазками):

import json

class QuizWindow(...): # Окно опросника

    def __init__(self):
        # Сигнал answer "выбрасывается" из виджета каждый раз когда
        # пользователь выделяет (или отменяет) вариант ответа (ответов)
        self.widgetQPage.answer.connect(self.answer)

    # Загрузка опросника (вызывается, например, при выборе соответствующего пункта меню)
    def load(self):
        # загружаем файл и берем из него данные из поля "q" (вопросы типа "q")
        with open("quizzes.json", "r") as read_file:
            self.q_data = json.load(read_file)["q"]
        self.qIdx = 0 # Устанавливаем индекс текущего вопроса в 0

    # Пользователь выбрал и нажал кнопку "следующий вопрос", или "начать"
    def nextQ(self):
        if self.qIdx < len(self.q_data):
            # Инициализируем виджет вопроса
            # первый аргумент - индекс вопроса
            # второй - сам вопрос
            self.widgetQPage.setQuizzes(self.qIdx, self.q_data[self.qIdx])
            self.qIdx += 1 # Смещаем индекс
        else:
            # Вопросы закончились - показываем результат

    # Слот для получения ответов пользователя
    def answer(self, idx, ans_ids):
        # Сохраняем ответ пользователя (например в ассоциативный массив)
        # в котором ключ - это номер вопроса (idx), а значение это массив id ответов (ans_ids)

Здесь widgetQPage имя объекта виджета в котором отображаются вопросы и из которого собираются ответы пользователя (например, через сигнал), может состоять из текстового поля самого вопроса и таблицы/списка для выбора варианта ответов/ответа

→ Ссылка