Неправильная запись в файл
подскажите как правильно записать данные с вот этого кода
import csv
import datetime
import os
from random import randint
import openpyxl
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMessageBox
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1223, 578)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.QuestionField = QtWidgets.QTextBrowser(self.centralwidget)
self.QuestionField.setObjectName("QuestionField")
self.verticalLayout.addWidget(self.QuestionField)
self.EntryField = QtWidgets.QPlainTextEdit(self.centralwidget)
self.EntryField.setObjectName("EntryField")
self.verticalLayout.addWidget(self.EntryField)
self.ButtonNext = QtWidgets.QPushButton(self.centralwidget)
self.ButtonNext.setObjectName("ButtonNext")
self.verticalLayout.addWidget(self.ButtonNext)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Опросник"))
self.ButtonNext.setText(_translate("MainWindow", "Далее"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.question_list = [] # +++
self.wb_obj = openpyxl.load_workbook("questions.xlsx") # +++
self.ButtonNext.clicked.connect(self.get_next_question) # !!! +++
self.start_quiz()
self.get_next_question()
def get_next_question(self):
if len(self.question_list) < 3:
wb_sheet = self.wb_obj['Block_1']
elif len(self.question_list) == 3:
wb_sheet = self.wb_obj['Block_2']
elif len(self.question_list) == 4:
wb_sheet = self.wb_obj['Block_3']
else:
# sys.exit(app.exec_())
self.close()
answer = self.EntryField.toPlainText()
rows = wb_sheet.max_row
nums_wb = randint(2, rows)
question = wb_sheet[f'A{nums_wb}'].value
self.question_list.append(question)
self.QuestionField.setText(question)
self.write_to_file(question, answer)
print(question, '--', answer, '--', len(self.question_list))
self.EntryField.clear()
def write_to_file(self, question, answer):
with open(f"{os.getlogin()}_{datetime.date.today()}.csv", 'a',
encoding='cp1251', errors='replace', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow([question, answer])
def start_quiz(self):
greetings = QMessageBox()
greetings.setWindowTitle('Приветствие')
greetings.setText(
f'Приветствую тебя {os.getlogin()}. Предлогаю в начале рабочего дня пройти тебе тест на знание наших цен и предложений')
greetings.setIcon(QMessageBox.Information)
greetings.exec_()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Вот ссылка на файл чтоб можно было проверить https://docs.google.com/spreadsheets/d/1WKymcPzKrgxBLLMYD5s5TTW9S3t5Drfn/edit?usp=share_link&ouid=109137112156684725929&rtpof=true&sd=true
Необходимо чтоб при ответе на вопрос в файле сохранялась информация в виде вопрос-ответ в данный момент сохранение отрабатывает максимально странно
когда отвечаешь на первый вопрос ответ попадает на второй вопрос который только что создался, а первый остается пустым
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import csv
import datetime
import os
from random import randint
import openpyxl
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMessageBox
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1223, 578)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.QuestionField = QtWidgets.QTextBrowser(self.centralwidget)
self.QuestionField.setObjectName("QuestionField")
self.verticalLayout.addWidget(self.QuestionField)
self.EntryField = QtWidgets.QPlainTextEdit(self.centralwidget)
self.EntryField.setObjectName("EntryField")
self.verticalLayout.addWidget(self.EntryField)
self.ButtonNext = QtWidgets.QPushButton(self.centralwidget)
self.ButtonNext.setObjectName("ButtonNext")
self.verticalLayout.addWidget(self.ButtonNext)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Опросник"))
self.ButtonNext.setText(_translate("MainWindow", "Далее"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.question_list = []
self.question = '' # +++
self.ammount_of_questions = 4 # +++
self.wb_obj = openpyxl.load_workbook("questions.xlsx")
self.ButtonNext.clicked.connect(self.get_next_question)
self.start_quiz()
self.get_next_question()
def get_next_question(self):
# +++
num_question = len(self.question_list) # +++
print(f'num_question ==={num_question}===') #
if num_question < 3:
wb_sheet = self.wb_obj['Block_1']
elif num_question == 3:
wb_sheet = self.wb_obj['Block_2']
elif num_question == 4:
wb_sheet = self.wb_obj['Block_3']
else:
# self.close()
self.end_test()
return
answer = self.EntryField.toPlainText()
rows = wb_sheet.max_row
nums_wb = randint(2, rows)
question = wb_sheet[f'A{nums_wb}'].value
self.question_list.append(question)
self.QuestionField.setText(question)
# +++
if num_question: # +++
# self.write_to_file(question, answer)
# ---------------------------> vvvvvvvvvvvvv <------------------------------
self.write_to_file(self.question, answer) # +++
print(num_question, '--', self.question, '--', answer)
self.EntryField.clear()
# +++
self.question = question # +++
if num_question == self.ammount_of_questions: # +++
self.end_test() # +++
return # +++
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def end_test(self):
self.QuestionField.clear()
self.ButtonNext.setEnabled(False)
self.EntryField.setEnabled(False)
msg = QtWidgets.QMessageBox.information(
self,
'Тест закончен',
'Cпасибо за участие, хорошего вам дня.'
)
self.QuestionField.setText('''
Тест закончен, спасибо за участие.
Ваши результаты:
тут можно что-то написать о результатах тестирования.
''')
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def write_to_file(self, question, answer):
with open(f"{os.getlogin()}_{datetime.date.today()}.csv", 'a',
encoding='cp1251', errors='replace', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow([question, answer])
def start_quiz(self):
greetings = QMessageBox()
greetings.setWindowTitle('Приветствие')
greetings.setText(
f'Приветствую Вас {os.getlogin()}. Предлогаю в начале рабочего дня пройти тебе тест на знание наших цен и предложений')
greetings.setIcon(QMessageBox.Information)
greetings.exec_()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(300, 400)
w.show()
sys.exit(app.exec_())

