|
|
@@ -0,0 +1,234 @@
|
|
|
+import tkinter as tk
|
|
|
+from tkinter import messagebox, ttk
|
|
|
+class PrintSecurityGame:
|
|
|
+ def __init__(self, root):
|
|
|
+ self.root = root
|
|
|
+ self.root.title("Защитник печати")
|
|
|
+ self.root.geometry("800x600")
|
|
|
+ self.root.configure(bg="#f0f8ff")
|
|
|
+
|
|
|
+ self.score = 0
|
|
|
+ self.current_scene = 1
|
|
|
+
|
|
|
+ # Словарь сцен: номер → метод
|
|
|
+ self.scenes = {
|
|
|
+ 1: self.scene_1,
|
|
|
+ 2: self.scene_2,
|
|
|
+ 3: self.scene_3,
|
|
|
+ 4: self.scene_4,
|
|
|
+ 5: self.scene_5
|
|
|
+ }
|
|
|
+
|
|
|
+ self.display_scene()
|
|
|
+
|
|
|
+ def display_scene(self):
|
|
|
+ """Очищает окно и отображает текущую сцену"""
|
|
|
+ for widget in self.root.winfo_children():
|
|
|
+ widget.destroy()
|
|
|
+
|
|
|
+ if self.current_scene in self.scenes:
|
|
|
+ self.scenes[self.current_scene]()
|
|
|
+ else:
|
|
|
+ self.game_over()
|
|
|
+
|
|
|
+ def game_over(self):
|
|
|
+ """Финал игры: показ результата"""
|
|
|
+ frame = tk.Frame(self.root, bg="#f0f8ff")
|
|
|
+ frame.pack(pady=50)
|
|
|
+
|
|
|
+ tk.Label(
|
|
|
+ frame,
|
|
|
+ text="Игра завершена!",
|
|
|
+ font=("Arial", 24, "bold"),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#2c3e50"
|
|
|
+ ).pack(pady=20)
|
|
|
+
|
|
|
+ # Оценка результата по набранным баллам
|
|
|
+ if self.score >= 45:
|
|
|
+ result = "Отлично! Система полностью защищена."
|
|
|
+ elif self.score >= 30:
|
|
|
+ result = "Хорошо! Есть небольшие уязвимости."
|
|
|
+ elif self.score >= 15:
|
|
|
+ result = "Удовлетворительно. Требуется доработка защиты."
|
|
|
+ else:
|
|
|
+ result = "Критические уязвимости! Пересмотрите политику безопасности."
|
|
|
+
|
|
|
+ tk.Label(
|
|
|
+ frame,
|
|
|
+ text=f"Ваш итоговый счёт: {self.score}/50\n\n{result}",
|
|
|
+ font=("Arial", 14),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#2c3e50",
|
|
|
+ justify="center"
|
|
|
+ ).pack(pady=20)
|
|
|
+
|
|
|
+ tk.Button(
|
|
|
+ frame,
|
|
|
+ text="Начать заново",
|
|
|
+ command=self.restart,
|
|
|
+ bg="#3498db",
|
|
|
+ fg="white",
|
|
|
+ font=("Arial", 12),
|
|
|
+ padx=20
|
|
|
+ ).pack(pady=10)
|
|
|
+
|
|
|
+ def restart(self):
|
|
|
+ """Перезапуск игры"""
|
|
|
+ self.score = 0
|
|
|
+ self.current_scene = 1
|
|
|
+ self.display_scene()
|
|
|
+
|
|
|
+ # --- Сцены игры ---
|
|
|
+
|
|
|
+ def scene_1(self):
|
|
|
+ """Сцена 1: Аутентификация пользователей"""
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Сцена 1: Настройка аутентификации",
|
|
|
+ font=("Arial", 18, "bold"),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#2c3e50"
|
|
|
+ ).pack(pady=20)
|
|
|
+
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Выберите методы аутентификации для доступа к принтеру.",
|
|
|
+ font=("Arial", 12),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#34495e",
|
|
|
+ wraplength=700,
|
|
|
+ justify="center"
|
|
|
+ ).pack(pady=10)
|
|
|
+
|
|
|
+ # Переменные для чекбоксов
|
|
|
+ self.auth_vars = {
|
|
|
+ "smartcard": tk.BooleanVar(),
|
|
|
+ "pin": tk.BooleanVar(),
|
|
|
+ "biometry": tk.BooleanVar(),
|
|
|
+ "mfa": tk.BooleanVar()
|
|
|
+ }
|
|
|
+
|
|
|
+ tk.Checkbutton(
|
|
|
+ self.root,
|
|
|
+ text="Смарт‑карта",
|
|
|
+ variable=self.auth_vars["smartcard"],
|
|
|
+ bg="#f0f8ff",
|
|
|
+ font=("Arial", 11)
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ tk.Checkbutton(
|
|
|
+ self.root,
|
|
|
+ text="PIN‑код (6+ цифр)",
|
|
|
+ variable=self.auth_vars["pin"],
|
|
|
+ bg="#f0f8ff",
|
|
|
+ font=("Arial", 11)
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ tk.Checkbutton(
|
|
|
+ self.root,
|
|
|
+ text="Биометрия (отпечаток)",
|
|
|
+ variable=self.auth_vars["biometry"],
|
|
|
+ bg="#f0f8ff",
|
|
|
+ font=("Arial", 11)
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ tk.Checkbutton(
|
|
|
+ self.root,
|
|
|
+ text="Многофакторная аутентификация (MFA)",
|
|
|
+ variable=self.auth_vars["mfa"],
|
|
|
+ bg="#f0f8ff",
|
|
|
+ font=("Arial", 11)
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ # Кнопка проверки
|
|
|
+ tk.Button(
|
|
|
+ self.root,
|
|
|
+ text="Применить настройки",
|
|
|
+ command=self.check_scene_1,
|
|
|
+ bg="#27ae60",
|
|
|
+ fg="white",
|
|
|
+ font=("Arial", 12),
|
|
|
+ padx=20
|
|
|
+ ).pack(pady=30)
|
|
|
+
|
|
|
+ def check_scene_1(self):
|
|
|
+ """Проверка условий сцены 1"""
|
|
|
+ selected = [
|
|
|
+ self.auth_vars["smartcard"].get(),
|
|
|
+ self.auth_vars["pin"].get(),
|
|
|
+ self.auth_vars["biometry"].get(),
|
|
|
+ self.auth_vars["mfa"].get()
|
|
|
+ ]
|
|
|
+
|
|
|
+ if sum(selected) >= 2 and self.auth_vars["mfa"].get():
|
|
|
+ self.score += 10
|
|
|
+ messagebox.showinfo("Успех", "Правильно! MFA + ещё один метод обеспечивают надёжную защиту.")
|
|
|
+ self.current_scene += 1
|
|
|
+ self.display_scene()
|
|
|
+ else:
|
|
|
+ messagebox.showwarning(
|
|
|
+ "Ошибка",
|
|
|
+ "Выберите минимум 2 метода, включая MFA."
|
|
|
+ )
|
|
|
+
|
|
|
+ def scene_2(self):
|
|
|
+ """Сцена 2: Контроль вывода на печать"""
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Сцена 2: Настройка контроля печати",
|
|
|
+ font=("Arial", 18, "bold"),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#2c3e50"
|
|
|
+ ).pack(pady=20)
|
|
|
+
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Настройте правила вывода документов на принтер.",
|
|
|
+ font=("Arial", 12),
|
|
|
+ bg="#f0f8ff",
|
|
|
+ fg="#34495e",
|
|
|
+ wraplength=700,
|
|
|
+ justify="center"
|
|
|
+ ).pack(pady=10)
|
|
|
+
|
|
|
+ # Максимальное число копий
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Максимальное число копий:",
|
|
|
+ font=("Arial", 11),
|
|
|
+ bg="#f0f8ff"
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ self.copies_var = tk.IntVar(value=1)
|
|
|
+ ttk.Spinbox(
|
|
|
+ self.root,
|
|
|
+ from_=1,
|
|
|
+ to=10,
|
|
|
+ textvariable=self.copies_var,
|
|
|
+ width=5
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ # Водяной знак
|
|
|
+ tk.Label(
|
|
|
+ self.root,
|
|
|
+ text="Добавить водяной знак:",
|
|
|
+ font=("Arial", 11),
|
|
|
+ bg="#f0f8ff"
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|
|
|
+
|
|
|
+ self.watermark_var = tk.StringVar(value="Конфиденциально")
|
|
|
+ watermark_options = [
|
|
|
+ "Нет",
|
|
|
+ "Конфиденциально",
|
|
|
+ "ФИО пользователя",
|
|
|
+ "Дата и время",
|
|
|
+ "ID задания"
|
|
|
+ ]
|
|
|
+ ttk.Combobox(
|
|
|
+ self.root,
|
|
|
+ textvariable=self.watermark_var,
|
|
|
+ values=watermark_options,
|
|
|
+ state="readonly",
|
|
|
+ width=20
|
|
|
+ ).pack(anchor="w", padx=100, pady=5)
|