Найти - Пользователи
Полная версия: Вывод данных из файла в QTextEdit и в QLineEdit
Начало » GUI » Вывод данных из файла в QTextEdit и в QLineEdit
1
zxcvbnm
Мне нужно открыть файл с тестовыми заданиями, сначала записать вопрос в QTextEdit потом после маркера * вывести варианты ответов в QLineEdit , и после марекра *** перейти ко второму вопросу но оно у меня не корректно работает подскажите пожалуста где ошибка
 from PyQt5.QtWidgets import *
import sys
class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.resize(300, 250)
        self.lines = 0
        self.vid = ''
        vb = QVBoxLayout()
        self.setLayout(vb)
        self.but1 = QPushButton('Save')
        self.text1 = QTextEdit()
        self.le1 = QLineEdit()
        self.le2 = QLineEdit()
        self.but2 = QPushButton('Open')
        self.text2 = QTextEdit()
        self.le3 = QLineEdit()
        self.le4 = QLineEdit()
        self.le5 = QLineEdit()
        self.but3 = QPushButton("A")
        self.but4 = QPushButton("B")
        self.but5 = QPushButton("Remove")
        self.but6 = QPushButton("Next")
        vb.addWidget(self.but1)
        vb.addWidget(self.text1)
        vb.addWidget(self.le1)
        vb.addWidget(self.le2)
        vb.addWidget(self.le5)
        vb.addWidget(self.but2)
        vb.addWidget(self.text2)
        vb.addWidget(self.le3)
        vb.addWidget(self.le4)
        vb.addWidget(self.but3)
        vb.addWidget(self.but4)
        vb.addWidget(self.but6)
        vb.addWidget(self.but5)
        self.but1.clicked.connect(self.save_file)
        self.but2.clicked.connect(self.open_file)
        self.but3.clicked.connect(self.but3_click)
        self.but4.clicked.connect(self.but4_click)
        self.but6.clicked.connect(self.next)
        self.but5.clicked.connect(self.but_remove)
        self.show()
    def save_file(self):
        f = open( "test.txt" ,'a' )
        for item in self.text1.toPlainText():
            f.write(item)
        f.write('\n')
        f.write("*")
        f.write('\n')
        f.write(self.le1.text())
        f.write('\n')
        f.write(self.le2.text())
        f.write('\n')
        f.write(self.le5.text() + '\n')
        f.write("***\n")
        f.close()
    def but_remove(self):
        f = open("test.txt",'w+').readlines()
        for i in [0, 3, 1]:
            f.pop(i)
    def open_file(self):
        f = open('test.txt', 'r')
        self.F = open('temp.txt', 'w')
        for i in f:
            self.F.writelines(i)
        f.close()
        self.F.close()
        self.F = open('temp.txt')
        for line in self.F.readlines():
            if line.rstrip() == "*":
                self.lines += 1
                self.text2.append(line.rstrip())
                break
            self.lines += 1
            self.text2.append(line.rstrip())
        self.F.close()
        self.F = open('test.txt')
        lin = self.F.readlines()
        self.le3.setText((lin[self.lines]).rstrip())
        self.le4.setText((lin[self.lines + 1]).rstrip())
        self.vid = lin[self.lines + 2].rstrip()
        print(lin[self.lines+3])
    def next(self):
        print(self.lines)
        self.text2.clear()
        self.le3.clear()
        self.le4.clear()
        self.F.seek(self.lines)
        self.lines = 0
        for line in self.F.readlines():
            if line.rstrip() == "*":
                self.lines += 1
                self.text2.append(line.rstrip())
                break
            self.lines += 1
            self.text2.append(line.rstrip())
        self.F.close()
        self.F = open('test.txt')
        lin = self.F.readlines()
        self.le3.setText((lin[self.lines]).rstrip())
        self.le4.setText((lin[self.lines + 1]).rstrip())
        self.vid = lin[self.lines + 2].rstrip()
        print(lin[self.lines+3])
    def but3_click(self):
        if self.vid == 'A':
            print("True")
        else:
            print("False")
    def but4_click(self):
        if self.vid == 'B':
            print("True")
        else:
            print("False")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

zxcvbnm
Вот скриншот окна
PEHDOM
Меня всегда бесило когдп присылают скриншоты вставленые в .doc -файл.
Теперь меня начинает бесить когда файл котороый нужно скормить скрипту чтобы проверить его работоспособность присылают в виде скриншота. Вам прикрепить text.txt религия не позволяет?
Теперь по тексту. По вашему self.F.seek(self.lines) что должна делать? Судя по всему вы считаете то дожна переходить на строку self.lines, а на самом деле если верить документации http://pythonz.net/references/named/file.seek/ то self.lines в вашем сулчае смещение в байтах. в БАЙТАХ Карл!

теперь зачем у вас вот это?
 def open_file(self):
    f = open('test.txt', 'r')
        self.F = open('temp.txt', 'w')
        for i in f:
            self.F.writelines(i)
        f.close()
        self.F.close()
.......
если нужно сделать копию файла есть более простые способы, напмриер так
 from shutil import copyfile
copyfile(src, dst)

Вбщем вот так работает:

 from PyQt4.QtGui import *
import sys
import linecache
class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.resize(300, 250)
        self.lines = 0
        self.vid = ''
        vb = QVBoxLayout()
        self.setLayout(vb)
        self.but1 = QPushButton('Save')
        self.text1 = QTextEdit()
        self.le1 = QLineEdit()
        self.le2 = QLineEdit()
        self.but2 = QPushButton('Open')
        self.text2 = QTextEdit()
        self.le3 = QLineEdit()
        self.le4 = QLineEdit()
        self.le5 = QLineEdit()
        self.but3 = QPushButton("A")
        self.but4 = QPushButton("B")
        self.but5 = QPushButton("Remove")
        self.but6 = QPushButton("Next")
        vb.addWidget(self.but1)
        vb.addWidget(self.text1)
        vb.addWidget(self.le1)
        vb.addWidget(self.le2)
        vb.addWidget(self.le5)
        vb.addWidget(self.but2)
        vb.addWidget(self.text2)
        vb.addWidget(self.le3)
        vb.addWidget(self.le4)
        vb.addWidget(self.but3)
        vb.addWidget(self.but4)
        vb.addWidget(self.but6)
        vb.addWidget(self.but5)
        self.but1.clicked.connect(self.save_file)
        self.but2.clicked.connect(self.open_file)
        self.but3.clicked.connect(self.but3_click)
        self.but4.clicked.connect(self.but4_click)
        self.but6.clicked.connect(self.next)
        self.but5.clicked.connect(self.but_remove)
        self.show()
    def save_file(self):
        f = open( "test.txt" ,'a' )
        for item in self.text1.toPlainText():
            f.write(item)
        f.write('\n')
        f.write("*")
        f.write('\n')
        f.write(self.le1.text())
        f.write('\n')
        f.write(self.le2.text())
        f.write('\n')
        f.write(self.le5.text() + '\n')
        f.write("***\n")
        f.close()
    def but_remove(self):
        f = open("test.txt",'w+').readlines()
        for i in [0, 3, 1]:
            f.pop(i)
    def open_file(self):
        self.fileName = 'test.txt' # файл с котороым работает
        self.lines = sum(1 for l in open(self.fileName, 'r')) # к-во строк в файле
        if self.lines < 6:
            print('file {} is corrupter or empty'.format(self.fileName))
            return False
        self.currentLine = 1      # текущая строка
        self.getTest() # получаем  вопрос теста начиная с текущей строки
    def getTest(self):
        '''
        процедура получения теста
        '''
        while self.currentLine < self.lines:
            line = linecache.getline(self.fileName, self.currentLine) # получаем текущую строку
            self.text2.append(line.rstrip())
            if line.rstrip() == "*":                             # если нащли * то следующин строки должны содержать:
                line = linecache.getline(self.fileName, self.currentLine+1).rstrip()  # первый ответ
                self.le3.setText(line)
                line = linecache.getline(self.fileName, self.currentLine+2).rstrip()  # второй ответ
                self.le4.setText(line)
                line = linecache.getline(self.fileName, self.currentLine+3).rstrip()  # правильный ответ
                self.vid = line
                print(linecache.getline(self.fileName, self.currentLine+4).rstrip())  # ***
                self.currentLine += 5
                break
            self.currentLine += 1
    def next(self):
        if self.currentLine >= self.lines: # если конец файла то тест окончен
            print('TEST COmpleted')
            return False
        self.text2.clear()
        self.le3.clear()
        self.le4.clear()
        self.getTest()   # получаем следующий тест
    def but3_click(self):
        if self.vid == 'A':
            print("True")
        else:
            print("False")
    def but4_click(self):
        if self.vid == 'B':
            print("True")
        else:
            print("False")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

А вообще вы занимаетесь онанизмом в чистом виде. Ваш подход к работе имеет смысл только в двух случаях.
1. Данные вам уже приходят в таком виде.
2.Обучение, чтобы понять как работае тот или иной алгоритм

ну или так, если не хотите использовать linecache, а нужно file.readline\readlines
 from PyQt4.QtGui import *
import sys
class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.resize(300, 250)
        self.lines = 0
        self.vid = ''
        vb = QVBoxLayout()
        self.setLayout(vb)
        self.but1 = QPushButton('Save')
        self.text1 = QTextEdit()
        self.le1 = QLineEdit()
        self.le2 = QLineEdit()
        self.but2 = QPushButton('Open')
        self.text2 = QTextEdit()
        self.le3 = QLineEdit()
        self.le4 = QLineEdit()
        self.le5 = QLineEdit()
        self.but3 = QPushButton("A")
        self.but4 = QPushButton("B")
        self.but5 = QPushButton("Remove")
        self.but6 = QPushButton("Next")
        vb.addWidget(self.but1)
        vb.addWidget(self.text1)
        vb.addWidget(self.le1)
        vb.addWidget(self.le2)
        vb.addWidget(self.le5)
        vb.addWidget(self.but2)
        vb.addWidget(self.text2)
        vb.addWidget(self.le3)
        vb.addWidget(self.le4)
        vb.addWidget(self.but3)
        vb.addWidget(self.but4)
        vb.addWidget(self.but6)
        vb.addWidget(self.but5)
        self.but1.clicked.connect(self.save_file)
        self.but2.clicked.connect(self.open_file)
        self.but3.clicked.connect(self.but3_click)
        self.but4.clicked.connect(self.but4_click)
        self.but6.clicked.connect(self.next)
        self.but5.clicked.connect(self.but_remove)
        self.show()
    def save_file(self):
        f = open( "test.txt" ,'a' )
        for item in self.text1.toPlainText():
            f.write(item)
        f.write('\n')
        f.write("*")
        f.write('\n')
        f.write(self.le1.text())
        f.write('\n')
        f.write(self.le2.text())
        f.write('\n')
        f.write(self.le5.text() + '\n')
        f.write("***\n")
        f.close()
    def but_remove(self):
        f = open("test.txt",'w+').readlines()
        for i in [0, 3, 1]:
            f.pop(i)
    def open_file(self):
        self.fileName = 'test.txt' # файл с котороым работает
        F = open(self.fileName)
        self.Data = F.readlines()   #считываем файл и помещаем строки файла в self.Data
        self.lines = len(self.Data) # к-во строк в файле
        F.close()
        if self.lines < 6:
            print('file {} is corrupter or empty'.format(self.fileName))
            return False
        self.currentLine = 0      # текущая строка
        self.getTest() # получаем  вопрос теста начиная с текущей строки
    def getTest(self):
        '''
        процедура получения теста
'''
        while self.currentLine < self.lines:
            line = self.Data[self.currentLine] # получаем текущую строку
            self.text2.append(line.rstrip())
            if line.rstrip() == "*":                             # если нащли * то следующин строки должны содержать:
                line = self.Data[self.currentLine+1].rstrip()  # первый ответ
                self.le3.setText(line)
                line = self.Data[ self.currentLine+2].rstrip()  # второй ответ
                self.le4.setText(line)
                line = self.Data[self.currentLine+3].rstrip()  # правильный ответ
                self.vid = line
                print(self.Data[self.currentLine+4].rstrip())  # ***
                self.currentLine += 5
                break
            self.currentLine += 1
    def next(self):
        if self.currentLine >= self.lines: # если конец файла то тест окончен
            print('TEST COmpleted')
            return False
        self.text2.clear()
        self.le3.clear()
        self.le4.clear()
        self.getTest()   # получаем следующий тест
    def but3_click(self):
        if self.vid == 'A':
            print("True")
        else:
            print("False")
    def but4_click(self):
        if self.vid == 'B':
            print("True")
        else:
            print("False")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB