Как сделать программу для тестирования с самостоятельным созданием тестов?
Хочу создать программу которая будет проводить тестирования и при этом каждый мог сам составить тест. Но как это реализовать не знаю. Какие способы есть. Графику сделаю на фреймворке 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>
Из преимуществ подобного решения, это возможность удобно билдить вопросы из разного количества вариантов ответов и количества правильных ответов.
Можно использовать 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 имя объекта виджета в котором отображаются вопросы и из которого собираются ответы пользователя (например, через сигнал), может состоять из
текстового поля самого вопроса и таблицы/списка для выбора варианта ответов/ответа