사용자
I want you to convert this app to web. Give me the ENTIRE CODE. with all features. Code should contain every peace of feature(UI and not UI). Give me only code, without any another text. Also, give me one file per message(first html, than ask me to continue, same story with js and css):import sys import csv import random from PyQt5.QtWidgets import ( QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QWidget, QFileDialog, QMessageBox, QProgressBar, QPushButton, QCheckBox ) from PyQt5.QtCore import Qt, QTimer, pyqtSlot from PyQt5.QtGui import QFont class VocabularyApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Vocabulary Learning App") self.setGeometry(100, 100, 800, 600) self.vocabulary = [] self.current_index = 0 self.incorrect_attempts = 0 self.correct_words = [] self.incorrect_words = [] self.night_mode = True # Night mode as default self.initUI() def initUI(self): # Set font font = QFont("Arial", 12) self.setFont(font) # Main layout centralWidget = QWidget(self) self.setCentralWidget(centralWidget) mainLayout = QVBoxLayout(centralWidget) # Night mode toggle, checked by default self.mode_toggle = QCheckBox("Night Mode", self) self.mode_toggle.setChecked(True) self.mode_toggle.stateChanged.connect(self.toggle_mode) mainLayout.addWidget(self.mode_toggle) # Progress bar and indicator progressLayout = QHBoxLayout() self.progress_bar = QProgressBar(self) self.progress_indicator = QLabel("Word 0 of 0", self) progressLayout.addWidget(self.progress_bar) progressLayout.addWidget(self.progress_indicator) mainLayout.addLayout(progressLayout) # Word label with enhanced typography self.word_label = QLabel("Please load vocabulary", self) self.word_label.setFont(QFont("Arial", 14, QFont.Bold)) self.word_label.setAlignment(Qt.AlignCenter) mainLayout.addWidget(self.word_label) # Translation entry with shadow self.translation_entry = QLineEdit(self) self.translation_entry.setAlignment(Qt.AlignCenter) self.translation_entry.setPlaceholderText("Type the German translation here") self.translation_entry.setStyleSheet("border: 2px solid #76EEC6; border-radius: 5px; padding: 5px;") mainLayout.addWidget(self.translation_entry) # Feedback label for user input and correct answer self.user_input_label = QLabel("", self) self.correct_answer_label = QLabel("", self) mainLayout.addWidget(self.user_input_label) mainLayout.addWidget(self.correct_answer_label) # Check and show answer buttons with color coding buttonsLayout = QHBoxLayout() self.check_button = QPushButton("Check Answer", self) self.check_button.setStyleSheet("background-color: #32CD32;") # Primary action color self.check_button.clicked.connect(self.check_translation) self.show_answer_button = QPushButton("Reveal Correct Answer", self) self.show_answer_button.setStyleSheet("background-color: #1E90FF;") # Secondary action color self.show_answer_button.clicked.connect(self.show_correct_answer) self.show_answer_button.hide() # Hide by default buttonsLayout.addWidget(self.check_button) buttonsLayout.addWidget(self.show_answer_button) mainLayout.addLayout(buttonsLayout) # Load vocabulary button self.load_button = QPushButton("Load Vocabulary", self) self.load_button.clicked.connect(self.load_vocabulary) mainLayout.addWidget(self.load_button) # Set the initial style self.toggle_style(self.night_mode) # Keyboard shortcuts self.translation_entry.returnPressed.connect(self.check_translation) # Continue and repeat incorrect buttons self.continue_button = QPushButton("Continue", self) self.continue_button.clicked.connect(self.continue_session) self.continue_button.hide() # Hide by default self.repeat_button = QPushButton("Repeat Incorrect Words", self) self.repeat_button.clicked.connect(self.repeat_incorrect) self.repeat_button.hide() # Hide by default # Add continue and repeat buttons to the layout mainLayout.addWidget(self.continue_button) mainLayout.addWidget(self.repeat_button) def toggle_style(self, night_mode): if night_mode: self.setStyleSheet(""" QWidget { font-size: 18px; color: #E0E0E0; background: #333333; } QPushButton { background-color: #607D8B; color: white; border-radius: 10px; padding: 10px; margin: 10px; font-weight: bold; } QPushButton:hover { background-color: #455A64; } QLineEdit { border-radius: 10px; padding: 10px; margin: 10px; border: 2px solid #76EEC6; background: #333333; color: #E0E0E0; } QLabel { color: #E0E0E0; } QProgressBar { border: 2px solid #76EEC6; border-radius: 5px; text-align: center; background: #333333; } QProgressBar::chunk { background-color: #76EEC6; width: 20px; } QCheckBox { font-weight: bold; color: #E0E0E0; } """) else: self.setStyleSheet(""" QWidget { font-size: 18px; color: #2F4F4F; background: #FFFFFF; } QPushButton { background-color: #5F9EA0; color: white; border-radius: 10px; padding: 10px; margin: 10px; font-weight: bold; } QPushButton:hover { background-color: #2F4F4F; } QLineEdit { border-radius: 10px; padding: 10px; margin: 10px; border: 2px solid #5F9EA0; background: #FFFFFF; color: #2F4F4F; } QLabel { color: #2F4F4F; } QProgressBar { border: 2px solid #5F9EA0; border-radius: 5px; text-align: center; background: #FFFFFF; } QProgressBar::chunk { background-color: #5F9EA0; width: 20px; } QCheckBox { font-weight: bold; } """) @pyqtSlot(int) def toggle_mode(self, state): self.night_mode = bool(state) self.toggle_style(self.night_mode) @pyqtSlot() def load_vocabulary(self): file_path, _ = QFileDialog.getOpenFileName(self, "Load vocabulary", "", "CSV files (*.csv);;All Files (*)") if file_path: with open(file_path, newline='', encoding='utf-8') as file: reader = csv.reader(file, delimiter=';') self.vocabulary = list(reader) random.shuffle(self.vocabulary) self.progress_bar.setMaximum(len(self.vocabulary)) self.progress_bar.setValue(0) self.progress_indicator.setText(f"Word 0 of {len(self.vocabulary)}") self.next_word() self.show_answer_button.hide() self.load_button.setText("Reload Vocabulary") self.incorrect_attempts = 0 self.correct_words = [] self.incorrect_words = [] @pyqtSlot() def check_translation(self): if not self.vocabulary: QMessageBox.information(self, "Info", "Please load vocabulary") return user_input = self.translation_entry.text() correct_answer = self.vocabulary[self.current_index][1] self.user_input_label.setText(f"Your translation: {user_input}") if user_input.lower() == correct_answer.lower(): self.correct_words.append((self.vocabulary[self.current_index][0], user_input)) self.feedback("Correct!", True) self.incorrect_attempts = 0 QTimer.singleShot(1500, self.next_word) else: self.incorrect_attempts += 1 self.incorrect_words.append((self.vocabulary[self.current_index][0], user_input)) self.feedback("Incorrect. Try again.", False) if self.incorrect_attempts >= 3: self.show_answer_button.show() # Reveal the button after 3 incorrect attempts def feedback(self, message, correct): color = 'green' if correct else 'red' self.correct_answer_label.setText(message) self.correct_answer_label.setStyleSheet(f'color: {color}; font-weight: bold;') def next_word(self): self.current_index += 1 if self.current_index >= len(self.vocabulary): self.end_session() return self.progress_bar.setValue(self.current_index) self.progress_indicator.setText(f"Word {self.current_index} of {len(self.vocabulary)}") self.word_label.setText(f"Enter the German translation for word: '{self.vocabulary[self.current_index][0]}'") self.translation_entry.clear() self.user_input_label.clear() self.correct_answer_label.clear() self.translation_entry.setFocus() def end_session(self): results_message = "End of vocabulary list. Review your results:\n\n" results_message += "Correct words:\n" + "\n".join([f"{word[0]} - {word[1]}" for word in self.correct_words]) # Modified to include correct answers for incorrect words results_message += "\n\nIncorrect words:\n" + "\n".join([ f"{word[0]} - {word[1]} (Correct: {self.find_correct_answer(word[0])})" for word in self.incorrect_words ]) msgBox = QMessageBox() msgBox.setWindowTitle("Session Complete") msgBox.setText(results_message) continue_button = msgBox.addButton("Continue", QMessageBox.AcceptRole) repeat_button = msgBox.addButton("Repeat Incorrect Words", QMessageBox.AcceptRole) msgBox.exec() if msgBox.clickedButton() == continue_button: self.reset_app() elif msgBox.clickedButton() == repeat_button: self.repeat_incorrect() def find_correct_answer(self, word): for vocab_word, correct_answer in self.vocabulary: if vocab_word == word: return correct_answer return "N/A" # In case word is not found, which shouldn't happen def reset_app(self): self.current_index = 0 self.progress_bar.setValue(0) self.progress_indicator.setText("Word 0 of 0") self.vocabulary = [] self.incorrect_attempts = 0 self.correct_words = [] self.incorrect_words = [] self.load_vocabulary() @pyqtSlot() def show_correct_answer(self): if self.vocabulary: correct_word = self.vocabulary[self.current_index][1] self.feedback(f"The correct answer is: {correct_word}", False) else: QMessageBox.information(self, "Info", "Please load vocabulary") def continue_session(self): self.continue_button.hide() self.repeat_button.hide() if self.current_index < len(self.vocabulary): self.next_word() else: self.end_session() def repeat_incorrect(self): # Create a new vocabulary list with the correct answers for the incorrect words self.vocabulary = [(word[0], self.find_correct_answer(word[0])) for word in self.incorrect_words] # Resetting the session parameters self.correct_words = [] self.incorrect_words = [] self.current_index = 0 self.progress_bar.setMaximum(len(self.vocabulary)) self.progress_bar.setValue(0) self.progress_indicator.setText(f"Word 0 of {len(self.vocabulary)}") self.show_answer_button.hide() self.continue_button.hide() self.repeat_button.hide() self.next_word() if __name__ == "__main__": app = QApplication(sys.argv) ex = VocabularyApp() ex.show() sys.exit(app.exec_())