# -*- coding: utf-8 -*-
import file_handler
import sys
from PyQt4 import QtGui, QtCore
class Manager (object):
def __init__(self):
self.login = Login()
self.login.show()
self.login.next_page.connect(self.show_quests)
def show_quests (self, id, file):
self.quiz = Quiz(id, file)
self.login.hide()
self.quiz.next_page.connect(self.show_result)
self.quiz.show()
def show_result (self, id):
self.result = Result(id)
self.quiz.hide()
self.result.show()
class Window (QtGui.QWidget):
def __init__ (self):
QtGui.QWidget.__init__(self, None)
self.setWindowTitle(u'Тест')
def center (self):
screen = QtGui.QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) / 2,
(screen.height() - size.height()) / 2)
class Login (Window):
next_page = QtCore.pyqtSignal(int, str)
THEMES = file_handler.read_file('themes.yml')
def __init__ (self):
Window.__init__(self)
self.setFixedSize(500, 150)
self.center()
self.create_widgets()
self.connect_signals()
def create_widgets (self):
self.name_label = QtGui.QLabel(u'ФИО:')
self.group_label = QtGui.QLabel(u'Группа:')
self.name_input = QtGui.QLineEdit()
self.group_input = QtGui.QLineEdit()
self.subject_box = QtGui.QComboBox()
self.theme_box = QtGui.QComboBox()
self.ok_button = QtGui.QPushButton(u'Перейти к тесту')
self.ok_button.setDisabled(1)
self.subject_box.addItem(u'Выберите предмет')
self.add_subjects()
self.theme_box.addItem(u'Выберите тему')
layout = QtGui.QGridLayout()
layout.addWidget(self.name_label, 0, 0)
layout.addWidget(self.name_input, 0, 1)
layout.addWidget(self.group_label, 0, 2)
layout.addWidget(self.group_input, 0, 3)
layout.addWidget(self.subject_box, 1, 0, 1, 2)
layout.addWidget(self.theme_box, 1, 2, 1, 2)
layout.addWidget(self.ok_button, 2, 3)
self.setLayout(layout)
def add_subjects (self):
for subject in self.THEMES:
self.subject_box.addItem(subject)
def add_themes (self, subject):
self.theme_box.addItem(u'Выберите тему')
for theme in self.THEMES[subject]:
self.theme_box.addItem(theme)
def connect_signals (self):
self.subject_box.activated.connect(self.selected_subject)
self.ok_button.clicked.connect(self.save_n_next)
self.name_input.textChanged.connect(self.test_of_entry)
self.group_input.textChanged.connect(self.test_of_entry)
self.theme_box.activated.connect(self.test_of_entry)
def test_of_entry (self):
if (self.theme_box.currentIndex() != 0) and \
(self.subject_box.currentIndex() != 0) and \
(self.name_input.text()) and (self.group_input.text()):
self.ok_button.setEnabled(1)
else:
self.ok_button.setDisabled(1)
def save_n_next (self):
theme = '%s' % self.theme_box.currentText().toUtf8()
name = '%s' % self.name_input.text().toUtf8()
group = '%s' % self.group_input.text().toUtf8()
id = file_handler.Log.add_entry(theme, name, group, u'Оценки нет')
subject = '%s'.encode('cp1251') % self.subject_box.currentText()
theme = '%s'.encode('cp1251') % self.theme_box.currentText()
self.next_page.emit(id, '%s - %s.yml' % (subject, theme))
def selected_subject (self):
self.theme_box.clear()
if self.subject_box.currentIndex() != 0:
curr_subject = '%s' % self.subject_box.currentText().toUtf8()
curr_subject = curr_subject.decode('utf-8')
self.add_themes(curr_subject)
else:
self.theme_box.addItem(u'Выберите тему')
self.test_of_entry()
class Quiz (Window):
next_page = QtCore.pyqtSignal(int)
def __init__ (self, id, quest_file):
Window.__init__(self)
self.id = id
self.result = 0
self.quests_amount = -1
self.quest_file = file_handler.read_file(quest_file)
self.quests = []
for quest in self.quest_file:
self.quests.append(quest)
self.quests_amount += 1
self.quest_num = 0
self.curr_quest = self.quests[self.quest_num]
self.setFixedSize(600, 300)
self.center()
self.create_widgets()
def create_widgets (self):
self.ok_button = QtGui.QPushButton(u'Выбрать')
self.ok_button.setDisabled(1)
self.ok_button.clicked.connect(self.on_click)
self.quest_text = QtGui.QLabel(self.curr_quest.decode('utf-8'))
self.image = QtGui.QLabel(self)
self.image.setFixedSize(500, 250)
self.buttons = QtGui.QButtonGroup()
self.buttons.buttonReleased.connect(self.get_selected_var)
self.answer_vars = QtGui.QVBoxLayout()
self.create_buttons()
image = self.quest_file[self.curr_quest][0][2]
if image != 'None':
self.image.setPixmap(QtGui.QPixmap(image))
else:
self.image.setPixmap(QtGui.QPixmap('no_image.png'))
layout = QtGui.QGridLayout()
layout.addWidget(self.quest_text, 0, 0, 1, 2)
layout.addLayout(self.answer_vars, 1, 0)
layout.addWidget(self.image, 1, 1)
layout.addWidget(self.ok_button, 2, 0, 1, 2)
self.setLayout(layout)
def create_buttons (self):
id = 0
for quest in self.quest_file[self.curr_quest]:
var = QtGui.QRadioButton(quest[0])
self.answer_vars.addWidget(var)
self.buttons.addButton(var, id)
id += 1
def remove_buttons (self):
for b in self.buttons.buttons():
b.setParent(None)
def get_selected_var (self):
self.selected_var = self.buttons.checkedId()
self.ok_button.setEnabled(1)
def on_click (self):
if self.quest_file[self.curr_quest][self.selected_var][1] == True:
self.result += 1
if self.quest_num != self.quests_amount:
self.refresh_widgets()
else:
self.grade = float(self.result) / float(self.quests_amount + 1) * 100
self.set_grade()
self.next_page.emit(self.id)
def set_grade (self):
log = file_handler.read_file('log.yml')
entry = log[self.id]
entry.pop()
entry.append(self.grade)
file_handler.Log.change_entry(self.id, entry)
def refresh_widgets (self):
self.quest_num += 1
self.curr_quest = self.quests[self.quest_num]
image = self.quest_file[self.curr_quest][0][2]
if image != 'None':
self.image.setPixmap(QtGui.QPixmap(image))
else:
self.image.setPixmap(QtGui.QPixmap('no_image.png'))
self.quest_text.setText(self.curr_quest.decode('utf-8'))
self.ok_button.setDisabled(1)
self.remove_buttons()
self.create_buttons()
class Result (Window):
def __init__ (self, id):
Window.__init__(self)
self.setFixedSize(300, 150)
self.center()
self.get_info(id)
self.create_widgets()
def get_info (self, id):
log = file_handler.read_file('log.yml')
entry = log[id]
self.info_student = entry[0].decode('utf-8')
self.info_group = entry[1].decode('utf-8')
self.info_theme = entry[2].decode('utf-8')
self.info_grade = entry[3]
def create_widgets (self):
self.student = QtGui.QLabel('%s: %s' % (u'Студент', self.info_student))
self.group = QtGui.QLabel('%s: %s' % (u'Группа', self.info_group))
self.theme = QtGui.QLabel('%s: %s' % (u'Тема', self.info_theme))
self.grade = QtGui.QLabel('%s (%%): %i' % (u'Оценка', self.info_grade))
self.exit_button = QtGui.QPushButton (u'Закончить тест')
self.exit_button.clicked.connect(self.close)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.student)
layout.addWidget(self.group)
layout.addWidget(self.theme)
layout.addWidget(self.grade)
layout.addWidget(self.exit_button)
self.setLayout(layout)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
app.lastWindowClosed.connect(app.quit)
window = Manager()
app.exec_()
test/test.py