Untitled

 avatar
unknown
python
a year ago
6.7 kB
3
Indexable
import PyQt5.QtCore
from PyQt5.QtWidgets import *
from random import *

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_list = []
q1 = Question('0:0','∞', '0','1', '-0')
q2 = Question('0!', '1', '-0', '0', '100')
q3 = Question('2+2', '4', '5', '6', '69')
q4 = Question('Сколько хромосом у папоротника', '39', '40', '300', '30')
q5 = Question('В каком году родился Григорий Александрович Потёмкин', '1739','1379','1793','1937')
q6 = Question('Сколько лет Владимиру Владимировичу Путину на момент 11.02.2024?', '71', '69', '72','61')
q7 = Question('В каком году родился самый известнейший австрийский художник,\n смогший захватить пол мира, потерпевший поражение в 1945','1889', '1908','1998', '1898')

question_list.append(q1)
question_list.append(q2)
question_list.append(q3)
question_list.append(q4)
question_list.append(q5)
question_list.append(q6)
question_list.append(q7)

app = QApplication([])

# окно приложения
window = QWidget()
window.setWindowTitle('Memory Card')
window.resize(400, 300)

# интерфейс приложения
btn_OK = QPushButton('Ответить')

lbl_question = QLabel('Самый сложный вопрос в мире!')
RadioGroupBox = QGroupBox('Варианты ответов')

# группа на экране дя переключателей с ответами

btn_1 = QRadioButton('Вариант 1')
btn_2 = QRadioButton('Вариант 2')
btn_3 = QRadioButton('Вариант 3')
btn_4 = QRadioButton('Вариант 4')

# группируем переключатели ответов
RadioGroup = QButtonGroup()

RadioGroup.addButton(btn_1)
RadioGroup.addButton(btn_2)
RadioGroup.addButton(btn_3)
RadioGroup.addButton(btn_4)

# линии для размещения виджетов
line_ans1 = QHBowLayout()
line_ans2 = QVBowLayout()
line_ans3 = QVBowLayout()
# вертикальные линии будут внутри горизонтальной...
line_ans2.addWidget(btn_1)
line_ans2.addWidget(btn_2)
line_ans3.addWidget(btn_3)
line_ans3.addWidget(btn_4)

# разместим столбцы в одной линии
line_ans1.addLayout(line_ans2)
line_ans1.addLayout(line_ans3)
# панель с вариантами ответов
RadioGroupBox.setLayout(line_ans1)
AnsGroupBox = QGroupBox('Результат теста')
lb_Result = QLabel('текст')
lb_Correct = QLabel('ответ')

layout_res = QVBoxLayout()
layout_res.addwidget(lb_Result, alignment=(Qt.AlignLeft | Qt.AlignTop))
layout_res.addwidget(lb_Correct, alignment=Qt.AlignCenter, stretch=2)
AnsGroupBox.setLayout(layout_res)

layout_line1 = QHBoxLayout()
layout_line2 = QHBoxLayout()
layout_line3 = QHBoxLayout()

layout_line1.addWidget(lbl_question, alignment=(Qt.AlignCenter | Qt.AlignVCenter))
layout_line2.addWidget(RadioGroupBox)
layout_line3.addWidget(AnsGroupBox)

# скроем панель ответов, потому что сначала высвечивается панел вопросов:
AnsGroupBox.hide()
layout_line3.addStretch(1)
layout_line3.addWidget(btn_OK, stretch=2)
layout_line3.addStretch(1)

layout_card = QVBoxLayout()

layout_card.addLayout(layout_lin3, stretch=2)
layout_card.addLayout(layout_lin3, stretch=8)
layout_card.addStretch(1)
layout_card.addLayout(layout_lin3, stretch=1)
layout_card.addStretch(1)
layout_card.addSpacing(5)


def show_result():
    # показать панель ответов
    RadioGroupBox.hide()
    AnsGroupBox.show()
    btn_OK.setText('Следующий вопрос')



    # показать панель вопросов
    RadioGroupBox.show()
    AnsGroupBox.hide()
    btn_OK.setText('Ответить')
    RadioGroup.setExclusive(False)
    btn_1.setChecked(False)
    btn_2.setChecked(False)
    btn_3.setChecked(False)
    btn_4.setChecked(False)
    RadioGroup.setExclusive(True)


answers = [btn_1, btn_2, btn_3, btn_4]


def ask(q):
    # функция записывает значения вопроса и ответов в нужные виджеты...
    shuffle(answers)
    answers[0].setText(q.right_answer)
    answers[1].setText(q.wrong1)
    answers[2].setText(q.wrong2)
    answers[3].setText(q.wrong3)
    lbl_question.setText(q.question) # вопрос
    lb_Correct.setText(q.right_answer) # ответ
    show_question() # показываем панель вопросов


def show_correct(res):
    # установим текст в надпись 'результат' и покажем нужную панеь
    lbl_question.setText(res)
    show_result()


def check_answer():
    # проверяет вариант ответа, показывает панель ответов
    if answers[0].isChcked():
        show_correct('Верно!')
        window.score += 1
        print(f'Статистика:\nВсего вопросов: {window.total}\nПравильных ответов: {window.score}')
        print(f'Рейтинг: {window.score / window.total * 100}%')
    elif answers[1].isChecked() or answers[2].isChecked() or answers[3].isChecked():
        show_correct('Неверно!')
        print(f'Рейтинг:{window.score / window.total * 100}%')


def next_question():
    # задаёт следующий вопрос из списка
    window.total += 1
    print(f'Статистика:\nВсего вопросов: {window.total}\nПравильных ответов: {window.score}')
    cur_question = randint(0, len(question_list) - 1)
    q = question_list[cur_question]
    ask(q)


def click_OK():
    # определяет, надо показывать другой вопрос или проверить ответ на этот
    if btn_OK.text() == 'Ответить':
        check_answer()
    else:
        next_question()


window.setLayout(Layout_card)
window.setWindowTitle('Memory Card')
window.cur_question = -1

btn_OK. clicked.connect(click_OK())
window.score = 0 # правильно
window.total = 0 # всего
next_question()
window.show()
app.exec()
Leave a Comment