from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from random import randint, shuffle
#импортируем модуль с цветом и логотипом
#from mts import *
from steppe import *
#from bashkirenergo import *
#from segezha_group import *
 
# открытие файла и чтение файла
all_item_list = []
with open(file_name, encoding='UTF-8') as file:
   test_name = file.readline() # первая строчка файла - название теста
   for line in file:
      all_item_list.append(line.strip())  # построчно считываем файл
 
class Question():
   ''' содержит вопрос, правильный ответ и три неправильных'''
   def __init__(self, question, right_answer, wrong1, wrong2, wrong3):
       self.question = question
       self.right_answer = right_answer
       self.wrong1 = wrong1
       self.wrong2 = wrong2
       self.wrong3 = wrong3
 
# заполняем список вопросов объектами класса Question
questions_list = []
i = 0
while i < len(all_item_list):
   questions_list.append(Question(all_item_list[i], all_item_list[i+1], all_item_list[i+2], all_item_list[i+3], all_item_list[i+4] ))
   i = i + 5 # шаг 5 элементов, т.к 1 вопрос + 4 варианта ответа
 
shuffle(questions_list) #перемешиваем список вопросов
 
app = QApplication([])
 
#с помощью setStyleSheet задаём стиль виджетам
btn_OK = QPushButton('Ответить') # кнопка ответа
btn_OK.setStyleSheet(ans_button_style)
btn_OK.setFixedSize(200, 50) # устанавливаем фиксированный размер виджетам
lb_Question = QLabel("Вопрос") # текст вопроса
lb_Question.setWordWrap(True) #перенос строки вопроса
lb_Test = QLabel(test_name) # название теста
lb_Question.setFixedSize(1450, 100)
lb_Question.setStyleSheet(q_text_style)
lb_Test.setStyleSheet(header_text_style)
RadioGroupBox = QGroupBox("Варианты ответов") # группа на экране для переключателей с ответами
RadioGroupBox.setFixedSize(1450, 300)
RadioGroupBox.setStyleSheet(radio_group_style)
 
Res_list = QListWidget() # виджет для вывода списка вопросов и правильных ответов в конце теста
Res_list.hide()
Res_list.setStyleSheet(lw_res_list_style)
 
rbtn_1 = QRadioButton('Вариант 1')
rbtn_2 = QRadioButton('Вариант 2')
rbtn_3 = QRadioButton('Вариант 3')
rbtn_4 = QRadioButton('Вариант 4')
 
pixmap = QPixmap(logo) #создаём объект-картинку
logo = QLabel() # создаём контейнер под объект-картинку
logo.resize(pixmap.width(), pixmap.height()) # меняем размер контейнера под картинку
logo.setPixmap(pixmap) # добавляем объект-картинку
 
rbtn_1.setStyleSheet(radiobutton_style)
rbtn_2.setStyleSheet(radiobutton_style)
rbtn_3.setStyleSheet(radiobutton_style)
rbtn_4.setStyleSheet(radiobutton_style)
 
RadioGroup = QButtonGroup() # для группировки переключателей, чтобы управлять их поведением
RadioGroup.addButton(rbtn_1)
RadioGroup.addButton(rbtn_2)
RadioGroup.addButton(rbtn_3)
RadioGroup.addButton(rbtn_4)
layout_ans1 = QHBoxLayout()  
layout_ans2 = QVBoxLayout() # вертикальные будут внутри горизонтального
layout_ans3 = QVBoxLayout()
layout_ans2.addWidget(rbtn_1) # два ответа в первый столбец
layout_ans2.addWidget(rbtn_2)
layout_ans3.addWidget(rbtn_3) # два ответа во второй столбец
layout_ans3.addWidget(rbtn_4)
 
layout_ans1.addLayout(layout_ans2)
layout_ans1.addLayout(layout_ans3) # разместили столбцы в одной строке
RadioGroupBox.setLayout(layout_ans1) # готова "панель" с вариантами ответов
AnsGroupBox = QGroupBox("Результат теста")
AnsGroupBox.setStyleSheet(result_group_style)
lb_Finish = QLabel("Тест окончен")
lb_Finish.setStyleSheet(lb_Finish_style)
lb_Result = QLabel("") # здесь будет размещен результат теста(количество правильных ответов)
lb_Result.setStyleSheet(lb_Result_style)
 
layout_res = QVBoxLayout()
layout_res.addWidget(lb_Finish, alignment=(Qt.AlignLeft | Qt.AlignTop))
layout_res.addWidget(lb_Result, alignment=(Qt.AlignCenter | Qt.AlignTop))
AnsGroupBox.setLayout(layout_res)
layout_line0 = QHBoxLayout()
layout_line1 = QHBoxLayout() # вопрос и картинка
layout_line2 = QHBoxLayout() # варианты ответов или результат теста
layout_line3 = QHBoxLayout() # кнопка "Ответить"
 
layout_line0.addWidget(lb_Test,alignment=(Qt.AlignLeft| Qt.AlignBottom))
layout_line0.addWidget(Res_list,alignment=Qt.AlignLeft)
layout_line0.addWidget(logo, alignment=Qt.AlignRight)
layout_line1.addWidget(lb_Question,alignment=Qt.AlignLeft)
 
layout_card = QVBoxLayout()
 
layout_line2.addWidget(RadioGroupBox)  
layout_line2.addWidget(AnsGroupBox) 
AnsGroupBox.hide() # скроем панель с ответом, сначала должна быть видна панель вопросов
 
layout_line3.addStretch(1)
layout_line3.addWidget(btn_OK)
layout_line3.addStretch(1)
layout_card.addLayout(layout_line0,stretch=2)
layout_card.addLayout(layout_line1,stretch=2)
layout_card.addLayout(layout_line2, stretch=4)
layout_card.addStretch(1)
layout_card.addLayout(layout_line3, stretch=1)
layout_card.addStretch(1)
layout_card.setSpacing(2) # пробелы между содержимым
 
def show_question():
   ''' показать панель вопросов '''
   btn_OK.setText('Ответить')
   RadioGroup.setExclusive(False) # сняли ограничения, чтобы можно было сбросить выбор радиокнопки
   rbtn_1.setChecked(False)
   rbtn_2.setChecked(False)
   rbtn_3.setChecked(False)
   rbtn_4.setChecked(False)
   RadioGroup.setExclusive(True) # вернули ограничения, теперь только одна радиокнопка может быть выбрана
answers = [rbtn_1, rbtn_2, rbtn_3, rbtn_4]
def ask(q: Question):
   ''' функция записывает значения вопроса и ответов в соответствующие виджеты,
   при этом варианты ответов распределяются случайным образом'''
   shuffle(answers) # перемешали список из кнопок, теперь на первом месте списка какая-то непредсказуемая кнопка
   answers[0].setText(q.right_answer) # первый элемент списка заполним правильным ответом, остальные - неверными
   answers[1].setText(q.wrong1)
   answers[2].setText(q.wrong2)
   answers[3].setText(q.wrong3)
   lb_Question.setText(q.question) # вопрос
   show_question() # показываем панель вопросов
 
'''ПЕРЕКЛЮЧЕНИЕ МЕЖДУ ВОПРОСАМИ И ОТОБРАЖЕНИЕ РЕЗУЛЬТАТОВ ТЕСТА'''
 
def check_answer():
   ''' проверка ответа на правильность '''
   if answers[0].isChecked():
       window.score += 1
       next_question()
   else:
       if answers[1].isChecked() or answers[2].isChecked() or answers[3].isChecked():
           next_question()
 
def next_question():
   ''' задает вопрос из списка вопросов '''
   window.total += 1
   if window.total <= len(questions_list):
       q = questions_list[window.total - 1] # взяли вопрос
       ask(q) # спросили
   else:
       show_result()
 
def show_result():
   ''' функция показывает результаты теста'''
   btn_OK.setText("Закрыть")
   btn_OK.setFixedSize(300, 50)
   btn_OK.setStyleSheet(res_button_style)
   RadioGroupBox.hide()
   lb_Question.hide()
   AnsGroupBox.show()
   lb_Result.setText('Всего вопросов: '+str(window.total-1)+ '\n\nПравильных ответов: '+str(window.score))
 
def click_OK():
   ''' определяет, что делать в зависимости от надписи на кнопке'''
   if btn_OK.text() == 'Ответить':
       check_answer() # проверка ответа
   elif btn_OK.text() == 'Закрыть':  
       exit()
 
window = QWidget()
window.setStyleSheet(background)
window.setLayout(layout_card)
window.setWindowTitle("Тестирование")
btn_OK.clicked.connect(click_OK) # по нажатии на кнопку выбираем, что конкретно происходит
 
window.score = 0
window.total = 0
 
next_question()
window.setFixedSize(win_width, win_height)
window.show()
app.exec()
