Проєкт "Тестування". Етап 4. Перемішування та зображення
Перемішування питань
Для перемішування питань всередині тесту досить додати команду перемішування після зчитування всіх питань тесту з файлу:
random.shuffle(quiz)
Для того, щоб працювала команда перемішування потрібно імпортувати модуль import random
Перемішування відповідей у питанні
Перемішування відповідей всередині питання організувати дещо складніше. Саме перемішування текстів відповідей відбувається у функції def show_question, де перед виведенням в область options потрібно додати команду random.shuffle(quiz[n].show_answers()).
Проте тепер не буде перевірятись правильність відповіді користувача. Проаналізуємо, яким чином зараз відбувається перевірка відповіді - функцію def check(e)
def check(e):
result.grid(row=0,column=2)
b=quiz[number].show_correct_text()
a=''
for i in options.curselection():
a=a+options.get(i)+"\n"
if a.strip()==b.strip():
result.configure(text="YES")
user[number]=1
else:
result.configure(text="NO")
user[number]=0
Порівнюються дві змінні: a та b, котрі є рядками (string): b - правильна відповідь з файлу, а - відповідь користувача. Якщо варіанти перемішані, то відповідь користувача а змінюється: наприклад, замість "Червоний Зелений Синій" вона буде "Зелений Червоний Синій". Тож варто сортувати складові відповіді користувача, а також задавати правильну відповідь у відсортованому варіанті: "Зелений Синій Червоний".
Внесемо відповідні зміни у проект.
Сортування відповідей питання потрібно виконувати одразу після зчитування інформації з файлу, поки номери правильних відповідей відповідають їхнім текстам. Тому створимо в об'єкті Question властивість self.correct_text, котра при ініціалізації об'єкту буде порожнім рядком.
Після зчитування варіантів відповідей з файлу викличемо метод question.set_correct_text(), котрий полягає у заповненні властивості self.correct_text рядком з відсортованих правильних відповідей.
Спочатку формується список з правильних відповідей, а потім цей відсортований список перетворюється на рядок.
def set_correct_text(self):
k=[]
for i in self.correct:
k.append(self.ans[int(i)-1])
self.correct_text=''.join(sorted(k))
Повернути значення цього рядка у програму можна функцією def show_correct_text_sorted(self).
def show_correct_text_sorted(self):
return self.correct_text
Таким чином, правильна відповідь на питання повертатиметься у програму функцією show_correct_text_sorted() і міститиме рядок з відсортованими правильними варіантами відповідей.
Функція перевірки правильності відповіді
Аналогічну операцію сортування потрібно виконати і з рядком, котрий утворюється з відповідей користувача, у функції def check(e).
def check(e):
result.grid(row=0,column=2)
b=quiz[number].show_correct_text_sorted()
c=[]
for i in options.curselection():
c.append(options.get(i).strip())
a="\n".join(sorted(c))
if a.strip()==b.strip():
result.configure(text="YES")
user[number]=1
else:
result.configure(text="NO")
user[number]=0
Таким чином, у змінній b міститься еталонна відповідь (з функції show_correct_text_sorted()), а у змінній а - відповідь користувача, із вибраними варіантами в алфавітному порядку. Якщо ці змінні збігаються, відповідь є правильною, про що сповіщає напис result, а у список user записується значення 1.
Зображення у тесті
До деяких запитань потрібно додавати ілюстративні зображення. Для початку потрібно внести зміни у текстовий файл: для кожного питання потрібно додати по 1 рядку, котрий може містити назву файлу із зображенням, або порожній рядок.
Далі слід передбачити поле виведення зображення у графічному інтерфейсі:
pic=PhotoImage(file="python.gif")
picture = Label(root,image=pic, height=200, width=200)
picture.grid(row=0, column=2,sticky=W, rowspan=3)
Змінна pic містить назву файлу зображення, а picture - область його виведення.
При формуванні об'єкту Question потрібно передбачити зчитування рядка з назвою файлу зображення та запис цієї інформації у відповідне поле об'єкту.
Поле властивості ініціалізації об'єкту: self.picture=''
Методи заповнення та показу властивості:
def add_pic(self,pic):
self.picture=pic.strip()
def show_pic(self):
return self.picture
Зчитування з файлу: question.add_pic(text.readline())
Залишається додати зміну зображення у функції показу питання show_question:
global pic
pic=PhotoImage(file = quiz[n].show_pic())
picture.configure(image = pic)