/
LeRe26
/
Random_Password_Generat
Обзор
Документация
Войти
/
LeRe26
/
Random_Password_Generat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
214 строк
10 KB
LeRe26
create: main.py, password_history.json, README.dm.txt, README.md
05 май 2026, 15:45
Верифицирован
05 май 2026, 15:45
a0024fb
Код
Авторство
О чём код?
import tkinter as tk from tkinter import ttk, messagebox import random import string import json import os from datetime import datetime # Файл для сохранения истории HISTORY_FILE = "password_history.json" class PasswordGenerator: def __init__(self, root): self.root = root self.root.title("Random Password Generator") self.root.geometry("700x600") self.root.resizable(True, True) # Загрузка истории self.history = self.load_history() self.create_widgets() self.refresh_history_display() # ---------- Работа с JSON ---------- def load_history(self): """Загружает историю паролей из JSON-файла""" if os.path.exists(HISTORY_FILE): try: with open(HISTORY_FILE, "r", encoding="utf-8") as f: return json.load(f) except: return [] return [] def save_history(self): """Сохраняет историю паролей в JSON-файл""" with open(HISTORY_FILE, "w", encoding="utf-8") as f: json.dump(self.history, f, ensure_ascii=False, indent=2) # ---------- Создание интерфейса ---------- def create_widgets(self): # Основной фрейм main_frame = ttk.Frame(self.root, padding="10") main_frame.pack(fill="both", expand=True) # --- Заголовок --- title_label = ttk.Label(main_frame, text="🔐 Генератор случайных паролей", font=("Arial", 16, "bold")) title_label.pack(pady=10) # --- Блок настроек --- settings_frame = ttk.LabelFrame(main_frame, text="Настройки пароля", padding="10") settings_frame.pack(fill="x", pady=5) # 1. Ползунок длины пароля ttk.Label(settings_frame, text="Длина пароля:").grid(row=0, column=0, padx=5, pady=5, sticky="w") self.length_var = tk.IntVar(value=12) self.length_scale = ttk.Scale(settings_frame, from_=4, to=32, orient="horizontal", variable=self.length_var, command=self.update_length_label) self.length_scale.grid(row=0, column=1, padx=5, pady=5, sticky="ew") self.length_label = ttk.Label(settings_frame, text="12") self.length_label.grid(row=0, column=2, padx=5, pady=5) # 2. Чекбоксы для выбора символов self.use_uppercase = tk.BooleanVar(value=True) self.use_lowercase = tk.BooleanVar(value=True) self.use_digits = tk.BooleanVar(value=True) self.use_special = tk.BooleanVar(value=False) ttk.Checkbutton(settings_frame, text="Заглавные буквы (A-Z)", variable=self.use_uppercase).grid(row=1, column=0, padx=5, pady=2, sticky="w") ttk.Checkbutton(settings_frame, text="Строчные буквы (a-z)", variable=self.use_lowercase).grid(row=1, column=1, padx=5, pady=2, sticky="w") ttk.Checkbutton(settings_frame, text="Цифры (0-9)", variable=self.use_digits).grid(row=2, column=0, padx=5, pady=2, sticky="w") ttk.Checkbutton(settings_frame, text="Спецсимволы (!@#$%^&*)", variable=self.use_special).grid(row=2, column=1, padx=5, pady=2, sticky="w") # 3. Кнопка генерации self.generate_btn = ttk.Button(settings_frame, text="🎲 Сгенерировать пароль", command=self.generate_password) self.generate_btn.grid(row=3, column=0, columnspan=3, pady=10) # --- Блок отображения сгенерированного пароля --- result_frame = ttk.LabelFrame(main_frame, text="Сгенерированный пароль", padding="10") result_frame.pack(fill="x", pady=5) self.password_var = tk.StringVar() self.password_entry = ttk.Entry(result_frame, textvariable=self.password_var, font=("Courier", 12), justify="center") self.password_entry.pack(fill="x", padx=5, pady=5) # Кнопка копирования self.copy_btn = ttk.Button(result_frame, text="📋 Копировать", command=self.copy_to_clipboard) self.copy_btn.pack(pady=5) # --- Таблица истории --- history_frame = ttk.LabelFrame(main_frame, text="История паролей", padding="10") history_frame.pack(fill="both", expand=True, pady=5) # Создаём Treeview (таблицу) columns = ('id', 'timestamp', 'length', 'password') self.tree = ttk.Treeview(history_frame, columns=columns, show='headings', height=8) self.tree.heading('id', text='№') self.tree.heading('timestamp', text='Дата и время') self.tree.heading('length', text='Длина') self.tree.heading('password', text='Пароль') self.tree.column('id', width=40, anchor='center') self.tree.column('timestamp', width=140, anchor='center') self.tree.column('length', width=60, anchor='center') self.tree.column('password', width=250, anchor='w') # Скроллбар scrollbar = ttk.Scrollbar(history_frame, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) self.tree.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") # Кнопка очистки истории self.clear_btn = ttk.Button(main_frame, text="🗑 Очистить историю", command=self.clear_history) self.clear_btn.pack(pady=5) def update_length_label(self, *args): """Обновляет отображение длины пароля""" self.length_label.config(text=str(self.length_var.get())) # ---------- Генерация пароля ---------- def generate_password(self): """Генерирует случайный пароль на основе выбранных параметров""" length = self.length_var.get() # 4. Проверка корректности ввода if length < 4: messagebox.showerror("Ошибка", "Минимальная длина пароля: 4 символа!") return if length > 32: messagebox.showerror("Ошибка", "Максимальная длина пароля: 32 символа!") return # Сбор символов для генерации chars = "" if self.use_uppercase.get(): chars += string.ascii_uppercase if self.use_lowercase.get(): chars += string.ascii_lowercase if self.use_digits.get(): chars += string.digits if self.use_special.get(): chars += "!@#$%^&*" # Проверка, что выбран хотя бы один набор символов if not chars: messagebox.showerror("Ошибка", "Выберите хотя бы один тип символов!") return # Генерация пароля password = ''.join(random.choice(chars) for _ in range(length)) # Перемешивание для большей случайности (необязательно, но улучшает) password_list = list(password) random.shuffle(password_list) password = ''.join(password_list) # Отображение пароля self.password_var.set(password) # Сохранение в историю self.add_to_history(password, length) def add_to_history(self, password, length): """Добавляет сгенерированный пароль в историю""" history_entry = { "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "length": length, "password": password } self.history.append(history_entry) self.save_history() self.refresh_history_display() def refresh_history_display(self): """Обновляет отображение истории паролей""" # Очищаем таблицу for item in self.tree.get_children(): self.tree.delete(item) if not self.history: return # Показываем последние 20 записей (от новых к старым) for i, entry in enumerate(reversed(self.history[-20:]), 1): self.tree.insert('', 'end', values=(i, entry['timestamp'], entry['length'], entry['password'])) def clear_history(self): """Очищает историю паролей""" if messagebox.askyesno("Подтверждение", "Вы уверены, что хотите очистить всю историю?"): self.history = [] self.save_history() self.refresh_history_display() messagebox.showinfo("Успех", "История очищена!") def copy_to_clipboard(self): """Копирует сгенерированный пароль в буфер обмена""" password = self.password_var.get() if password: self.root.clipboard_clear() self.root.clipboard_append(password) messagebox.showinfo("Успех", "Пароль скопирован в буфер обмена!") else: messagebox.showwarning("Предупреждение", "Нет пароля для копирования!") # ---------- Запуск приложения ---------- if __name__ == "__main__": root = tk.Tk() app = PasswordGenerator(root) root.mainloop()