Изменить цвет фона во время ввода правильного или не правильного ответа

Всем привет, имеется вот такой код

import base64
import csv
import datetime
import glob
import os
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from random import randint
from zipfile import ZipFile

import openpyxl
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMessageBox


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint)
        MainWindow.showMaximized()
        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)
        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(self.question, answer)
            self.EntryField.clear()

        self.question = question

        if num_question == self.ammount_of_questions:
            self.end_test()
            return

    def end_test(self):
        global zip_name
        global zipObj
        self.QuestionField.clear()
        self.ButtonNext.setEnabled(False)
        self.EntryField.setEnabled(False)
        msg = QtWidgets.QMessageBox.information(
            self,
            'Тест закончен',
            'Cпасибо за участие, хорошего вам дня.'
        )
        zipObj = ZipFile(f'{os.getlogin()}-{datetime.date.today()}.zip', 'w')
        for xlsxfile in glob.glob(os.path.join('.', '*.csv')):
            zipObj.write(xlsxfile)
        zipObj.close()
        zip_name = (f'{os.getlogin()}-{datetime.date.today()}' + '.zip')
        self.SendMail()
        self.close()

    def SendMail(self):
        msg = MIMEMultipart()
        sender = 'sender'
        recipients = ['other',]
        server = smtplib.SMTP('smtp.mail.ru', 587)
        server.starttls()
        server.login('[email protected]', 'passWORDS!@#')

        msg['Subject'] = f'Результаты тестирования сотрудника ' \
                         f'{os.getlogin()}-{datetime.date.today()}'
        msg['From'] = sender
        msg['To'] = ", ".join(recipients)
        part = MIMEBase('application', "zip")
        b = open(f'{os.getlogin()}-{datetime.date.today()}.zip', "rb").read()
        bs = base64.encodebytes(b).decode()
        part.set_payload(bs)
        part.add_header('Content-Transfer-Encoding', 'base64')
        part.add_header('Content-Disposition', 'attachment',
                        filename=f'{os.getlogin()}-{datetime.date.today()}.zip')
        msg.attach(part)
        server.sendmail(sender, recipients, msg.as_string())
        server.quit()

    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_())

В файле questions.xlsx есть вопрос и правильный ответ, как в поле
self.EntryField = QtWidgets.QPlainTextEdit(self.centralwidget) изменять фон на красный если ответ не верный и если ответ верный на зеленый

Пытался сделать через словарь вот так:

answer = self.EntryField.toPlainText()
correct_answer = wb_sheet[f'B{nums_wb}'].value

dictionary_question_answer = {}
dictionary_question_answer[question] = correct_answer
if dictionary_question_answer[question] == answer:
    self.EntryField.setStyleSheet('background-color: green')
else:
     self.EntryField.setStyleSheet('background-color: red')

Но при неправильном ответе он краситься в красный и все, потом при следующем вопросе он не возвращается в исходное состояние, как подправить код? вот тут можно скачать файл


Ответы (1 шт):

Автор решения: S. Nick

Пример, который вы предоставляете, должен быть минимальный и воспроизводимый.

Минимальный - значит содержать код, который касается только текущей проблемы.
Код, который что-то архивирует и отправляет по email не нужен.

Воспроизводимый - код копируется, запускается и демонстрирует текущую проблему.
Ваш пример не демонстрирует проблему, о которой вы пишите.

Вопрос в заголовке и описание, что вы хотите сделать, должно дополнять друг друга, а не противоречить одно другому.
Изменить цвет фона во время ввода и изменять фон если ответ верный или не верный - это разные вещи.

Из того что я понял, возможный вариант, может выглядеть так:

import os
import csv
from random import randint
import datetime

''' ! для тестирования решения текущей проблемы эти импорты не нужны
import base64
import glob
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from zipfile import ZipFile
'''
import openpyxl
from PyQt5 import QtCore, QtGui, QtWidgets, QtTest                 # +++   QtTest
from PyQt5.QtWidgets import QMessageBox


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        
# ???    self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint)
# ???    MainWindow.showMaximized()

        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.correct_answer = ''                                         # +++
        self.dictionary_question_answer = {}                             # +++ 
        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):
        self.EntryField.setFocus()                                       # +++
    
        num_question = len(self.question_list)
        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
#
        correct_answer = wb_sheet[f'B{nums_wb}'].value                    # +++ 
        self.dictionary_question_answer[question] = str(correct_answer)   # +++
        
        self.question_list.append(question)
        self.QuestionField.setText(question)
        if num_question:
            self.write_to_file(self.question, answer)
            
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv           
            if answer != self.dictionary_question_answer.get(self.question):
                self.EntryField.setStyleSheet('''
                    #EntryField {
                        background-color: #ea4242;
                        color: #ffc208;
                    }
                ''')
            else:
                self.EntryField.setStyleSheet('''
                    #EntryField {
                        background-color: #4ec65c;
                        color: #06528b;
                    }
                ''')
            self.QuestionField.setText(self.question)
            QtTest.QTest.qWait(1500)                                        # !!! 
            self.EntryField.setStyleSheet('')
            self.QuestionField.setText(question)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            self.EntryField.clear()

        self.question = question
        self.correct_answer = correct_answer                                 # +++

        if num_question == self.ammount_of_questions:
            self.end_test()
            return

    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 end_test(self):
# ???        global zip_name
# ???        global zipObj
        self.QuestionField.clear()
        self.ButtonNext.setEnabled(False)
        self.EntryField.setEnabled(False)
        msg = QtWidgets.QMessageBox.information(
            self,
            'Тест закончен',
            'Cпасибо за участие, хорошего вам дня.'
        )

# ! для тестирования решения текущей проблемы код ниже не нужен        
'''
        zipObj = ZipFile(f'{os.getlogin()}-{datetime.date.today()}.zip', 'w')
        for xlsxfile in glob.glob(os.path.join('.', '*.csv')):
            zipObj.write(xlsxfile)
        zipObj.close()
        zip_name = (f'{os.getlogin()}-{datetime.date.today()}' + '.zip')
        self.SendMail()
        self.close()
        
    def SendMail(self):
        msg = MIMEMultipart()
        sender = 'sender'
        recipients = ['other',]
        server = smtplib.SMTP('smtp.mail.ru', 587)
        server.starttls()
        server.login('[email protected]', 'passWORDS!@#')

        msg['Subject'] = f'Результаты тестирования сотрудника ' \
                         f'{os.getlogin()}-{datetime.date.today()}'
        msg['From'] = sender
        msg['To'] = ", ".join(recipients)
        part = MIMEBase('application', "zip")
        b = open(f'{os.getlogin()}-{datetime.date.today()}.zip', "rb").read()
        bs = base64.encodebytes(b).decode()
        part.set_payload(bs)
        part.add_header('Content-Transfer-Encoding', 'base64')
        part.add_header('Content-Disposition', 'attachment',
                        filename=f'{os.getlogin()}-{datetime.date.today()}.zip')
        msg.attach(part)
        server.sendmail(sender, recipients, msg.as_string())
        server.quit()

    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)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.resize(400, 400)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка