|
@@ -0,0 +1,118 @@
|
|
|
|
|
+
|
|
|
|
|
+import tkinter as tk
|
|
|
|
|
+from tkinter import messagebox
|
|
|
|
|
+
|
|
|
|
|
+# Вопросы и варианты ответов
|
|
|
|
|
+questions = [
|
|
|
|
|
+ {
|
|
|
|
|
+ "question": "Какие основные требования предъявляются к обработке и хранению персональных данных?",
|
|
|
|
|
+ "options": [
|
|
|
|
|
+ "Сбор по согласию, законность, конфиденциальность, ограничение сроков, актуальность, меры защиты",
|
|
|
|
|
+ "Только сбор без ограничений",
|
|
|
|
|
+ "Обработка без согласия"
|
|
|
|
|
+ ],
|
|
|
|
|
+ "correct": 0 # индекс правильного варианта
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "question": "Назовите хотя бы три примера организаций, в которых используются персональные данные.",
|
|
|
|
|
+ "options": [
|
|
|
|
|
+ "Банки, школы, соцсети",
|
|
|
|
|
+ "Автосервисы, киоски, такси",
|
|
|
|
|
+ "Кинотеатры, спортзалы, кафе"
|
|
|
|
|
+ ],
|
|
|
|
|
+ "correct": 0
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "question": "Какие основные законы регулируют защиту персональных данных в России и ЕС?",
|
|
|
|
|
+ "options": [
|
|
|
|
|
+ "GDPR, ФЗ-152",
|
|
|
|
|
+ "Закон о секретности",
|
|
|
|
|
+ "Закон о конфиденциальности"
|
|
|
|
|
+ ],
|
|
|
|
|
+ "correct": 0
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "question": "Какие виды персональных данных выделяет федеральный закон №152-ФЗ?",
|
|
|
|
|
+ "options": [
|
|
|
|
|
+ "Общие, Особые, Биометрические",
|
|
|
|
|
+ "Только общие",
|
|
|
|
|
+ "Демографические и финансовые"
|
|
|
|
|
+ ],
|
|
|
|
|
+ "correct": 0
|
|
|
|
|
+ }
|
|
|
|
|
+]
|
|
|
|
|
+
|
|
|
|
|
+class QuizApp:
|
|
|
|
|
+ def __init__(self, master):
|
|
|
|
|
+ self.master = master
|
|
|
|
|
+ master.title("Викторина по защите персональных данных")
|
|
|
|
|
+ master.geometry('700x400')
|
|
|
|
|
+ self.current_question = 0
|
|
|
|
|
+ self.correct_answers = 0
|
|
|
|
|
+
|
|
|
|
|
+ self.label = tk.Label(master, text=f"Вопрос {self.current_question+1} из {len(questions)}", font=("Arial", 14))
|
|
|
|
|
+ self.label.pack(pady=10)
|
|
|
|
|
+
|
|
|
|
|
+ self.question_label = tk.Label(master, text=questions[self.current_question]['question'], font=("Arial", 12))
|
|
|
|
|
+ self.question_label.pack(pady=10)
|
|
|
|
|
+
|
|
|
|
|
+ self.options_var = tk.IntVar()
|
|
|
|
|
+ self.options_var.set(-1) # Изначально ничего не выбрано
|
|
|
|
|
+
|
|
|
|
|
+ self.radio_buttons = []
|
|
|
|
|
+ for idx, option in enumerate(questions[self.current_question]['options']):
|
|
|
|
|
+ rb = tk.Radiobutton(master, text=option, variable=self.options_var, value=idx, font=("Arial", 12), wraplength=650, justify='left')
|
|
|
|
|
+ rb.pack(anchor='w', padx=20, pady=5)
|
|
|
|
|
+ self.radio_buttons.append(rb)
|
|
|
|
|
+
|
|
|
|
|
+ self.next_button = tk.Button(master, text="Ответить и перейти к следующему вопросу", command=self.check_answer)
|
|
|
|
|
+ self.next_button.pack(pady=20)
|
|
|
|
|
+
|
|
|
|
|
+ def check_answer(self):
|
|
|
|
|
+ selected = self.options_var.get()
|
|
|
|
|
+
|
|
|
|
|
+ # Проверка, выбрал ли пользователь вариант
|
|
|
|
|
+ if selected == -1:
|
|
|
|
|
+ messagebox.showwarning("Внимание", "Пожалуйста, выберите ответ.")
|
|
|
|
|
+ return
|
|
|
|
|
+
|
|
|
|
|
+ correct_idx = questions[self.current_question]['correct']
|
|
|
|
|
+
|
|
|
|
|
+ # Окрашивание в зеленый или красный
|
|
|
|
|
+ if selected == correct_idx:
|
|
|
|
|
+ self.correct_answers += 1
|
|
|
|
|
+ self.master.config(bg='green')
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.master.config(bg='red')
|
|
|
|
|
+
|
|
|
|
|
+ # После небольшой задержки восстановим фон и перейдем к следующему вопрос
|
|
|
|
|
+ self.master.after(1000, self.next_question)
|
|
|
|
|
+
|
|
|
|
|
+ def next_question(self):
|
|
|
|
|
+ # Сброс фона
|
|
|
|
|
+ self.master.config(bg='SystemButtonFace')
|
|
|
|
|
+
|
|
|
|
|
+ self.current_question += 1
|
|
|
|
|
+
|
|
|
|
|
+ if self.current_question < len(questions):
|
|
|
|
|
+ self.update_question()
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.show_result()
|
|
|
|
|
+
|
|
|
|
|
+ def update_question(self):
|
|
|
|
|
+ self.label.config(text=f"Вопрос {self.current_question+1} из {len(questions)}")
|
|
|
|
|
+ self.question_label.config(text=questions[self.current_question]['question'])
|
|
|
|
|
+ self.options_var.set(-1)
|
|
|
|
|
+
|
|
|
|
|
+ # Обновляем варианты ответов
|
|
|
|
|
+ for idx, rb in enumerate(self.radio_buttons):
|
|
|
|
|
+ rb.config(text=questions[self.current_question]['options'][idx], value=idx)
|
|
|
|
|
+
|
|
|
|
|
+ def show_result(self):
|
|
|
|
|
+ messagebox.showinfo("Результат", f"Вы правильно ответили на {self.correct_answers} из {len(questions)} вопросов!")
|
|
|
|
|
+ self.master.quit()
|
|
|
|
|
+
|
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
|
+ root = tk.Tk()
|
|
|
|
|
+ app = QuizApp(root)
|
|
|
|
|
+ root.mainloop()
|