Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2017 20:24:05

zxcvbnm
Зарегистрирован: 2017-02-11
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Програма тестерование

Вот я создал пока примитивную программу для тестирования но мне нужно чтобы в определенном типе задач можно было возвращаться к предыдущему вопросу реализовать нужно методы back, back2,back3,back4 для кажного метода next,next2,next3,next4 в соответствии. Пока что не могу понять как помогите.

 from PyQt5 import  QtCore,QtGui,QtWidgets,uic
import sys
class Begin(QtWidgets.QMainWindow):
    def __init__(self):
        super(Begin, self).__init__()
        self.ui = uic.loadUi("begin.ui")
        self.lines = 0
        self.sec = 15000
        self.mark = 0
        self.mass2 = []
        self.mass = []
        self.vid = ''
        self.ui.lb1.setVisible(0)
        self.ui.lb2.setVisible(0)
        self.ui.lb3.setVisible(0)
        self.ui.lb4.setVisible(0)
        self.ui.lb5.setVisible(0)
        self.ui.lb6.setVisible(0)
        self.ui.lb7.setVisible(0)
        self.ui.lb8.setVisible(0)
        self.ui.lb9.setVisible(0)
        self.pixmap = QtGui.QPixmap("begin.ico")
        self.pixmap1 = QtGui.QPixmap("false.ico")
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.on_timeout)
        self.ui.a.clicked.connect(self.a_click)
        self.ui.b.clicked.connect(self.b_click)
        self.ui.c.clicked.connect(self.c_click)
        self.ui.d.clicked.connect(self.d_click)
        self.ui.open.clicked.connect(self.open_file)
        self.ui.next.clicked.connect(self.next)
        self.ui.open2.clicked.connect(self.open_file2)
        self.ui.next2.clicked.connect(self.next2)
        self.ui.next3.clicked.connect(self.next3)
        self.ui.next4.clicked.connect(self.next4)
        self.ui.show()
    def on_timeout(self):
        self.sec -= 1
        self.ui.lcd3.display(self.sec % 60)
        self.ui.lcd2.display((self.sec // 60) % 60)
        self.ui.lcd1.display(self.sec // 3600)
        if self.sec < 0:
            self.timer.stop()
    def open_file(self):
        f1 = open('test5.txt', 'r')
        F1 = open('temp.txt', 'w')
        for i in f1:
            F1.writelines(i)
        f1.close()
        F1.close()
        F1 = open('temp.txt', 'r')
        s = []
        line = F1.readlines()
        s.append(line[0])
        s.append(line[1])
        s.append(line[2])
        s.append(line[3])
        self.ask = int(s[0])
        self.ask2 = int(s[1])
        self.ask3 = int(s[2])
        self.ask4 = int(s[3])
        F1.close()
        with open('temp.txt') as f:
            a = f.readlines()
        with open('temp.txt', 'w') as f:
            f.writelines(a[4:-1])
        self.fileName = 'temp.txt'
        F = open(self.fileName)
        self.Data = F.readlines()
        self.lines = len(self.Data)
        F.close()
        self.currentLine = 0
        self.getTest()
        self.timer.start(1000)
    def getTest(self):
        while self.currentLine < self.lines:
            line = self.Data[self.currentLine]
            self.ui.asked.append(line.rstrip())
            if line.rstrip() == "*":
                line = self.Data[self.currentLine + 1].rstrip()
                self.ui.a.setText(line)
                line = self.Data[self.currentLine + 2].rstrip()
                self.ui.b.setText(line)
                line = self.Data[self.currentLine + 3].rstrip()
                self.ui.c.setText(line)
                line = self.Data[self.currentLine + 4].rstrip()
                self.ui.d.setText(line)
                line = self.Data[self.currentLine + 5].rstrip()
                self.vid = line
                print(self.Data[self.currentLine + 6].rstrip())
                self.currentLine += 7
                self.ask-=1
                break
            self.currentLine += 1
    def next(self):
        print(self.lines)
        print(self.currentLine)
        self.ui.asked.setText(" ")
        self.ui.a.setText(" ")
        self.ui.b.setText(" ")
        self.ui.c.setText(" ")
        self.ui.d.setText(" ")
        self.getTest()
    def open_file2(self):
        self.mark2 = 0
        self.ui.lb1.setVisible(1)
        self.ui.lb2.setVisible(1)
        self.ui.lb3.setVisible(1)
        self.ui.lb4.setVisible(1)
        self.ui.lb5.setVisible(1)
        self.ui.lb6.setVisible(1)
        self.ui.lb7.setVisible(1)
        self.ui.lb8.setVisible(1)
        self.ui.lb9.setVisible(1)
        self.ui.a.setVisible(0)
        self.ui.b.setVisible(0)
        self.ui.c.setVisible(0)
        self.ui.d.setVisible(0)
        self.currentLine = 0
        self.fileName = 'temp.txt'
        F = open(self.fileName)
        self.Data = F.readlines()
        self.lines = len(self.Data)
        F.close()
        self.currentLine = 0
        self.getTest2()
    def getTest2(self):
        while self.currentLine < self.lines:
            line = self.Data[self.currentLine]
            self.ui.asked.append(line.rstrip())
            if line.rstrip() == "**":
                line = self.Data[self.currentLine + 1].rstrip()
                self.ui.lb1.setText(line)
                line = self.Data[self.currentLine + 2].rstrip()
                self.ui.lb2.setText(line)
                line = self.Data[self.currentLine + 3].rstrip()
                self.ui.lb3.setText(line)
                line = self.Data[self.currentLine + 4].rstrip()
                self.ui.lb4.setText(line)
                line = self.Data[self.currentLine + 5].rstrip()
                self.ui.lb5.setText(line)
                line = self.Data[self.currentLine + 6].rstrip()
                self.ui.lb6.setText(line)
                line = self.Data[self.currentLine + 7].rstrip()
                self.ui.lb7.setText(line)
                line = self.Data[self.currentLine + 8].rstrip()
                self.ui.lb8.setText(line)
                line = self.Data[self.currentLine + 9].rstrip()
                self.ui.lb9.setText(line)
                line = self.Data[self.currentLine + 10].rstrip()
                self.vid = line
                print(self.Data[self.currentLine + 11].rstrip())
                self.currentLine += 12
                self.ask3-=1
                break
            self.currentLine += 1
    def next2(self):
        if self.ask3 == 0:
            self.rez = 'A' + str(self.ui.sb1.value()) + 'B' + str(self.ui.sb2.value()) + 'C' + str(
                self.ui.sb3.value()) + 'D' + str(self.ui.sb4.value()) + 'F' + str(self.ui.sb5.value())
            if self.rez[0:2] == self.vid[0:2]:
                self.mark2 += 1
            if self.rez[2:4] == self.vid[2:4]:
                self.mark2 += 1
            if self.rez[4:6] == self.vid[4:6]:
                self.mark2 += 1
            if self.rez[6:8] == self.vid[6:8]:
                self.mark2 += 1
            if self.rez[8:10] == self.vid[8:10]:
                self.mark2 += 1
            self.ui.asked.setText(" ")
            self.qustoins2()
            self.open_file4()
        else:
            self.rez = 'A' + str(self.ui.sb1.value()) + 'B' + str(self.ui.sb2.value()) + 'C' + str(
                self.ui.sb3.value()) + 'D' + str(self.ui.sb4.value()) + 'F' + str(self.ui.sb5.value())
            if self.rez[0:2] == self.vid[0:2]:
                self.mark2 += 1
            if self.rez[2:4] == self.vid[2:4]:
                self.mark2 += 1
            if self.rez[4:6] == self.vid[4:6]:
                self.mark2 += 1
            if self.rez[6:8] == self.vid[6:8]:
                self.mark2 += 1
            if self.rez[8:10] == self.vid[8:10]:
                self.mark2 += 1
            self.ui.asked.setText(" ")
            self.getTest2()
    def open_file3(self):
        self.mark3 = 0
        self.vid2 = []
        self.ui.a.setVisible(0)
        self.ui.b.setVisible(0)
        self.ui.c.setVisible(0)
        self.ui.d.setVisible(0)
        self.currentLine = 0
        self.fileName = 'temp.txt'
        F = open(self.fileName)
        self.Data = F.readlines()
        self.lines = len(self.Data)
        F.close()
        self.currentLine = 0
        self.getTest3()
    def getTest3(self):
        while self.currentLine < self.lines:
            line = self.Data[self.currentLine]
            self.ui.asked.append(line.rstrip())
            if line.rstrip() == "***":
                line = self.Data[self.currentLine + 1].rstrip()
                self.ui.cb1.setText(line)
                line = self.Data[self.currentLine + 2].rstrip()
                self.ui.cb2.setText(line)
                line = self.Data[self.currentLine + 3].rstrip()
                self.ui.cb3.setText(line)
                line = self.Data[self.currentLine + 4].rstrip()
                self.ui.cb4.setText(line)
                line = self.Data[self.currentLine + 5].rstrip()
                self.ui.cb5.setText(line)
                line = self.Data[self.currentLine + 6].rstrip()
                self.ui.cb6.setText(line)
                line = self.Data[self.currentLine + 7].rstrip()
                self.vid2.append(line)
                line = self.Data[self.currentLine + 8].rstrip()
                self.vid2.append(line)
                print(self.Data[self.currentLine + 9].rstrip())
                self.currentLine += 10
                self.ask2-=1
                break
            self.currentLine += 1
        else:
            self.qustoins2()
            self.open_file2()
    def next3(self):
        if self.ask2 == 0:
            self.ui.asked.setText(" ")
            self.qustoins2()
            self.open_file2()
        else:
            self.ui.asked.setText(" ")
            print(self.lines)
            print(self.currentLine)
            if self.ui.cb1.isChecked():
                self.mass2.append("A")
            if self.ui.cb2.isChecked():
                self.mass2.append("B")
            if self.ui.cb3.isChecked():
                self.mass2.append("C")
            if self.ui.cb4.isChecked():
                self.mass2.append("D")
            if self.ui.cb5.isChecked():
                self.mass2.append("E")
            if self.ui.cb6.isChecked():
                self.mass2.append("F")
            for i in range(0, 2):
                for j in range(0, 2):
                    if self.vid2[i] == self.mass2[j]:
                        self.mark3 += 1
            self.mass2.clear()
            self.ui.cb1.setChecked(0)
            self.ui.cb2.setChecked(0)
            self.ui.cb3.setChecked(0)
            self.ui.cb4.setChecked(0)
            self.ui.cb5.setChecked(0)
            self.ui.cb6.setChecked(0)
            self.getTest3()
    def open_file4(self):
        self.mark4 = 0
        self.vid3 = ''
        self.currentLine = 0
        self.fileName = 'temp.txt'
        F = open(self.fileName)
        self.Data = F.readlines()
        self.lines = len(self.Data)
        F.close()
        self.currentLine = 0
        self.getTest4()
    def getTest4(self):
        while self.currentLine < self.lines:
            line = self.Data[self.currentLine]
            self.ui.asked.append(line.rstrip())
            if line.rstrip() == "****":
                line = self.Data[self.currentLine + 1].rstrip()
                self.vid3 = line
                print(self.Data[self.currentLine + 2].rstrip())
                self.currentLine += 3
                self.ask4-=1
                break
            self.currentLine += 1
        else:
            self.qustoins2()
            self.open_file4()
    def next4(self):
        if self.ask4 == 0:
            if self.vid3 == self.ui.le.text():
                self.mark4 += 1
                sum1 = self.mark+self.mark2+self.mark3+self.mark4
                print(sum1)
            QtWidgets.QMessageBox.information(window, "Finish", 'Marks' + str(self.mark),
                                              buttons=QtWidgets.QMessageBox.Close,
                                              defaultButton=QtWidgets.QMessageBox.Close)
            self.timer.stop()
            app.quit()
            return False
        else:
            if self.vid3 == self.ui.le.text():
                self.mark4 += 1
            self.ui.asked.setText(" ")
            self.getTest4()
    def qustoins2(self):
        with open('temp.txt') as f:
            a = f.readlines()
        with open('temp.txt', 'w') as f:
            f.writelines(a[self.currentLine:-1])
    def a_click(self):
        if self.vid == 'A':
            self.mark+=1
            self.ui.lb.setPixmap(self.pixmap)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
        else:
            self.ui.lb.setPixmap(self.pixmap1)
            
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
    def b_click(self):
        if self.vid == 'B':
            self.mark += 1
            self.ui.lb.setPixmap(self.pixmap)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
        else:
            self.ui.lb.setPixmap(self.pixmap1)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
    def c_click(self):
        if self.vid == 'C':
            self.mark += 1
            self.ui.lb.setPixmap(self.pixmap)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
        else:
            self.ui.lb.setPixmap(self.pixmap1)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
    def d_click(self):
        if self.vid == 'D':
            self.mark += 1
            self.ui.lb.setPixmap(self.pixmap)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
        else:
            self.ui.lb.setPixmap(self.pixmap1)
            if self.ask == 0:
                self.qustoins2()
                self.ui.asked.setText(" ")
                self.open_file3()
            else:
                self.next()
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Begin()
    sys.exit(app.exec())

Офлайн

#2 Апрель 5, 2017 09:50:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Програма тестерование

честно гворян так и хочется написать “ниасилил, многа букаф”
Коментариев хотябы минимальных , описывающих что делает та или иная процедура у вас в коде нету, Код на 400 строк с однотипными названиями а-ля lbХ cbХ, что они такое и за что отвечают непонятно, куча методов с названиями nextX getTestX open_fileX что они должны делать непонятно.Соответвенно что должны делать методы backХ тоже непонятно.
Даже запустить ваше чудо сумрачного гения, чтобы глазами посмотреть не получиться так как у вас используються некие ресурсы типа begin.ui begin.ico testХ.txt и тд., и где их брать тоже непонятно
По логике вещей метод backN должен вызывать метод nextN-1 но это только по логике…



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Апрель 5, 2017 10:49:55

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Програма тестерование

PEHDOM
Коментариев хотябы минимальных , описывающих что делает та или иная процедура у вас в коде нету, Код на 400 строк с однотипными названиями а-ля lbХ cbХ, что они такое и за что отвечают непонятно
Да тут очередные костыли (для проведения тестов), таких вопросов уйма на форуме, кто-то гемороится с удалением-созданием полей, кто-то еще извратней способ придумывает.
А ответ прост, использовать QStackWidget (если не ошибаюсь) - это уже ответ для ТС.

Офлайн

#4 Апрель 5, 2017 20:46:59

zxcvbnm
Зарегистрирован: 2017-02-11
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Програма тестерование

Метод openfile() открывает файл с задачами а метод next задает переход к следующему вопросу. next вопрос с четырьмя вариантами next2 завданяння на установление соответствия next3 вопрос с шестью вариантами next4 вопрос с записью правильного ответа. А мне нужно чтобы в каждом из типов можно было возвращаться к вопросам на которые еще не дан ответ.

Прикреплённый файлы:
attachment begin.ui (10,1 KБ)

Офлайн

#5 Апрель 5, 2017 20:47:34

zxcvbnm
Зарегистрирован: 2017-02-11
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Програма тестерование

иконка правильности ответа

Прикреплённый файлы:
attachment begin.ico (66,1 KБ)

Офлайн

#6 Апрель 5, 2017 20:49:54

zxcvbnm
Зарегистрирован: 2017-02-11
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Програма тестерование

файл з вопросами

Прикреплённый файлы:
attachment test5.txt (956 байт)

Офлайн

#7 Апрель 6, 2017 07:06:10

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Програма тестерование

zxcvbnm
Метод openfile() открывает файл с задачами а метод next задает переход к следующему вопросу. next вопрос с четырьмя вариантами next2 завданяння на установление соответствия next3 вопрос с шестью вариантами next4 вопрос с записью правильного ответа. А мне нужно чтобы в каждом из типов можно было возвращаться к вопросам на которые еще не дан ответ.
Если честно, то для меня данное пояснение шибко глаза не открыло на данное творение (код).
Опять же лично на мой взгляд, наблюдается не продуманность работы.
Как сделал бы я, во первых файл с заданиями перевел бы в xml или json (в структурированном виде бы хранился сам вопрос, варианты ответа на него и правильный ответ), во вторых создал бы класс в котором есть такие методы: загрузить файл заданий, получить задание по id, перейти к следующему заданию, проверить истинность ответа на задание (в случае правильного ответа, у задания проставляется признак выполнено), получить список не выполненных заданий и т. д.
А вот дальше бы уже ГУИ строил для работы с этим классом. Извиняюсь если немного скомкано написал (работы много, для форума есть от силы 30 - 40 мин. в день).

Отредактировано MrViktor (Апрель 6, 2017 07:21:54)

Офлайн

#8 Апрель 6, 2017 11:30:58

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Програма тестерование

zxcvbnm
Метод openfile() открывает файл с задачами а метод next задает переход к следующему вопросу. next вопрос с четырьмя вариантами next2 завданяння на установление соответствия next3 вопрос с шестью вариантами next4 вопрос с записью правильного ответа. А мне нужно чтобы в каждом из типов можно было возвращаться к вопросам на которые еще не дан ответ.
Хмм гдето я чтото подобное уже видел, и кажеться отвечал что вы занимаетесь онанизмом в чистом виде.
MrViktor +100
архитектура непродумана(ее вообще нет), в тексте кода все вперемешку, в одном методе несколько раз открываеться один и то же файл, потом копируеться, потом опять открываеться… зачем непонятно. Куча атрибутов и методов с однотипными названиями и неочевидным назначением. Данные храняться в неструктурированом виде, читаются хрен знает как, никакого контроля за целостностью нет, открыв ваш пример м нажав два раза кнопку next я увидел все вопросы, все ответы и перечень правильных ответов.
Разбирться в этом аде никто не будет.
Я бы на вашем месте, взял паузу и вернулся бы на несколько шагов назад.
Первое сменить тип хранения с ХЗ знает чего, в пользу структурированого вида(xml, json, ini) .В идеале конечно использовать embededBD но для начала сойдет и структкрированый текст.
Что вам это даст. Вам не нужно писать свой парсер, всю ответственность за чтени-запись-контроль вы перкладываете на сторонний модуль(xmlparser, jsonparser, configparser etc.) От вас нужно будет только указать что считать и в какие поля это поместить, При этом если какого обязательного поля нету вы сразу получите об этом уведомление.
Потом опредлиться с вашими тестами. Какую они должны иметь структуру? сколько ответов они могут содержать, сколькко правильных ответов может быть, какие действия должны к ним применяться.

Когда у вас это будет реализована , написать ГУИ для обработки структуры будет намного проще.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#9 Апрель 6, 2017 16:52:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Програма тестерование

MrViktor
во вторых создал бы класс в котором есть такие методы: загрузить файл заданий, получить задание по id, перейти к следующему заданию, проверить истинность ответа на задание (в случае правильного ответа, у задания проставляется признак выполнено), получить список не выполненных заданий и т. д.
Это называется комбайн или https://ru.wikipedia.org/wiki/Божественный_объект



Офлайн

#10 Апрель 14, 2017 06:08:03

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Програма тестерование

FishHook
Согласен, это был лишь толчок в правильное направление. Да и сам я еще до конца не познал ООП, в особенности, что нужно обернуть в класс, а что можно и отдельной функцией оставить (чтоб не плодить классы там где они нужны и не нужны).
Тут если подходить по правильному, то думаю надо создать класс “Загрузки” (работа к примеру с JSON файлом) один из методов которого будет возвращать объект “Задачник” с методами “Количество заданий”, “Задание по ID” и т.д., ну и класс “Задача” объект которого будет возвращать метод “Задание по ID”. Так же надо еще подумать нужен ли еще класс отдельного “Вопроса”.
Буду сильно признателен, если кто из гуру выскажет критику и даст более правильное разделение на классы (я многие вопросы с форума использую, как обучающею задачу для себя).

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version