|
| 1 | +import tkinter as tk |
| 2 | +from tkinter import messagebox |
| 3 | +from tkinter import ttk |
| 4 | +import string |
| 5 | +import random |
| 6 | +import pyperclip |
| 7 | + |
| 8 | +def generate_password(): |
| 9 | + length = length_var.get() |
| 10 | + if length <= 0: |
| 11 | + messagebox.showerror("Error", "Please enter a valid password length.") |
| 12 | + return |
| 13 | + |
| 14 | + character_set = '' |
| 15 | + if uppercase_var.get(): |
| 16 | + character_set += string.ascii_uppercase |
| 17 | + if lowercase_var.get(): |
| 18 | + character_set += string.ascii_lowercase |
| 19 | + if digits_var.get(): |
| 20 | + character_set += string.digits |
| 21 | + if symbols_var.get(): |
| 22 | + character_set += string.punctuation |
| 23 | + |
| 24 | + if not character_set: |
| 25 | + messagebox.showerror("Error", "Please select at least one character set.") |
| 26 | + return |
| 27 | + |
| 28 | + password = ''.join(random.choice(character_set) for _ in range(length)) |
| 29 | + password_entry.delete(0, 'end') |
| 30 | + password_entry.insert('end', password) |
| 31 | + |
| 32 | +def copy_password(): |
| 33 | + password = password_entry.get() |
| 34 | + if password: |
| 35 | + pyperclip.copy(password) |
| 36 | + messagebox.showinfo("Password Copied", "Password copied to clipboard successfully!") |
| 37 | + else: |
| 38 | + messagebox.showwarning("No Password", "No password to copy!") |
| 39 | + |
| 40 | +root = tk.Tk() |
| 41 | +root.title("Random Password Generator") |
| 42 | +root.geometry("500x500") |
| 43 | +root.configure(bg="#f0f0f0") |
| 44 | + |
| 45 | +frame = tk.Frame(root, bg="#f0f0f0") |
| 46 | +frame.pack(expand=True, padx=20, pady=20) |
| 47 | + |
| 48 | +length_label = tk.Label(frame, text="Password Length:", bg="#f0f0f0", font=("Helvetica", 12)) |
| 49 | +length_label.grid(row=0, column=0, sticky="w", pady=5) |
| 50 | + |
| 51 | +length_var = tk.IntVar() |
| 52 | +length_entry = tk.Entry(frame, textvariable=length_var, font=("Helvetica", 12)) |
| 53 | +length_entry.grid(row=0, column=1, sticky="w", pady=5) |
| 54 | + |
| 55 | +uppercase_var = tk.BooleanVar() |
| 56 | +uppercase_checkbox = tk.Checkbutton(frame, text="Uppercase", variable=uppercase_var, bg="#f0f0f0", font=("Helvetica", 10)) |
| 57 | +uppercase_checkbox.grid(row=1, column=0, sticky="w", pady=2) |
| 58 | + |
| 59 | +lowercase_var = tk.BooleanVar() |
| 60 | +lowercase_checkbox = tk.Checkbutton(frame, text="Lowercase", variable=lowercase_var, bg="#f0f0f0", font=("Helvetica", 10)) |
| 61 | +lowercase_checkbox.grid(row=2, column=0, sticky="w", pady=2) |
| 62 | + |
| 63 | +digits_var = tk.BooleanVar() |
| 64 | +digits_checkbox = tk.Checkbutton(frame, text="Digits", variable=digits_var, bg="#f0f0f0", font=("Helvetica", 10)) |
| 65 | +digits_checkbox.grid(row=3, column=0, sticky="w", pady=2) |
| 66 | + |
| 67 | +symbols_var = tk.BooleanVar() |
| 68 | +symbols_checkbox = tk.Checkbutton(frame, text="Symbols", variable=symbols_var, bg="#f0f0f0", font=("Helvetica", 10)) |
| 69 | +symbols_checkbox.grid(row=4, column=0, sticky="w", pady=2) |
| 70 | + |
| 71 | +generate_button = tk.Button(frame, text="Generate Password", command=generate_password, bg="#4CAF50", fg="white", font=("Helvetica", 12, "bold")) |
| 72 | +generate_button.grid(row=5, column=0, columnspan=2, pady=10) |
| 73 | + |
| 74 | +password_entry = tk.Entry(frame, show="*", font=("Helvetica", 14), justify="center") |
| 75 | +password_entry.grid(row=6, column=0, columnspan=2, pady=10) |
| 76 | + |
| 77 | +copy_button = tk.Button(frame, text="Copy Password", command=copy_password, bg="#008CBA", fg="white", font=("Helvetica", 12, "bold")) |
| 78 | +copy_button.grid(row=7, column=0, columnspan=2) |
| 79 | + |
| 80 | +def on_enter(event): |
| 81 | + event.widget.config(bg="#5EBABA") |
| 82 | + |
| 83 | +def on_leave(event): |
| 84 | + event.widget.config(bg="#008CBA" if event.widget == copy_button else "#4CAF50") |
| 85 | + |
| 86 | +copy_button.bind("<Enter>", on_enter) |
| 87 | +copy_button.bind("<Leave>", on_leave) |
| 88 | + |
| 89 | +generate_button.bind("<Enter>", on_enter) |
| 90 | +generate_button.bind("<Leave>", on_leave) |
| 91 | + |
| 92 | +def pulsate_animation(widget): |
| 93 | + def animate(): |
| 94 | + widget.config(bg="#5EBABA") |
| 95 | + widget.after(500, lambda: widget.config(bg="#4CAF50")) |
| 96 | + widget.after(1000, animate) |
| 97 | + animate() |
| 98 | + |
| 99 | +pulsate_animation(generate_button) |
| 100 | + |
| 101 | +root.mainloop() |
0 commit comments