-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
140 lines (109 loc) · 6.11 KB
/
Copy pathmain.py
File metadata and controls
140 lines (109 loc) · 6.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from string import ascii_lowercase, ascii_uppercase, digits, punctuation
import tkinter as tk
from tkinter import messagebox
from PIL import Image
import customtkinter as CTk
import password
import pyperclip
import os
import sys
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except AttributeError:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
class App(CTk.CTk):
def __init__(self):
super().__init__()
self.geometry("490x390")
self.title("Password Generator")
self.resizable(False, False)
img_path = resource_path("img.png")
self.logo = CTk.CTkImage(dark_image=Image.open(img_path), size=(400, 120))
self.logo_label = CTk.CTkLabel(master=self, text="", image=self.logo)
self.logo_label.grid(row=0, column=0, pady=(10, 0))
self.password_frame = CTk.CTkFrame(master=self, fg_color="transparent")
self.password_frame.grid(row=1, column=0, padx=(20, 20), pady=(10, 0), sticky="nsew")
self.entry_password = CTk.CTkEntry(master=self.password_frame, width=260, font=("Arial", 12))
self.entry_password.grid(row=0, column=0, padx=(0, 10))
self.btn_generate = CTk.CTkButton(master=self.password_frame, text="Generate", width=100,
command=self.set_password)
self.btn_generate.grid(row=0, column=1, padx=(0, 10))
self.btn_copy = CTk.CTkButton(master=self.password_frame, text="Copy", width=80, command=self.copy_password)
self.btn_copy.grid(row=0, column=2)
self.settings_frame = CTk.CTkFrame(master=self)
self.settings_frame.grid(row=2, column=0, padx=(20, 20), pady=(10, 0), sticky="nsew")
self.password_length_label = CTk.CTkLabel(master=self.settings_frame, text="Password Length:", font=("Arial", 12))
self.password_length_label.grid(row=0, column=0, columnspan=2, pady=(10, 0))
self.password_length_slider = CTk.CTkSlider(master=self.settings_frame, from_=8, to=50, number_of_steps=42,
command=self.slider_event)
self.password_length_slider.grid(row=1, column=0, columnspan=3, pady=(10, 10), sticky="ew")
self.password_length_entry = CTk.CTkEntry(master=self.settings_frame, width=50, font=("Arial", 12))
self.password_length_entry.grid(row=1, column=3, padx=(10, 0))
self.password_length_entry.insert(0, "12")
self.cb_digits_var = tk.StringVar()
self.cb_digits = CTk.CTkCheckBox(master=self.settings_frame, text="0-9",
variable=self.cb_digits_var, onvalue=digits, offvalue="")
self.cb_digits.grid(row=2, column=0, padx=5, pady=(10, 0))
self.cb_lower_var = tk.StringVar()
self.cb_lower = CTk.CTkCheckBox(master=self.settings_frame, text="a-z", variable=self.cb_lower_var,
onvalue=ascii_lowercase, offvalue="")
self.cb_lower.grid(row=2, column=1, padx=5, pady=(10, 0))
self.cb_upper_var = tk.StringVar()
self.cb_upper = CTk.CTkCheckBox(master=self.settings_frame, text="A-Z", variable=self.cb_upper_var,
onvalue=ascii_uppercase, offvalue="")
self.cb_upper.grid(row=2, column=2, padx=5, pady=(10, 0))
self.cb_symbols_var = tk.StringVar()
self.cb_symbols = CTk.CTkCheckBox(master=self.settings_frame, text="@#$%", variable=self.cb_symbols_var,
onvalue=punctuation, offvalue="")
self.cb_symbols.grid(row=2, column=3, padx=5, pady=(10, 0))
self.appearance_mode_option_menu = CTk.CTkOptionMenu(self.settings_frame,
values=["Light", "Dark", "System"],
command=self.change_appearance_mode_event)
self.appearance_mode_option_menu.grid(row=3, column=0, columnspan=4, pady=(10, 10))
self.btn_save = CTk.CTkButton(master=self.settings_frame, text="Save Password", command=self.save_password)
self.btn_save.grid(row=4, column=0, columnspan=4, pady=(10, 10))
self.appearance_mode_option_menu.set("System")
self.password_length_slider.set(12)
def slider_event(self, value):
self.password_length_entry.delete(0, 'end')
self.password_length_entry.insert(0, str(int(value)))
def change_appearance_mode_event(self, new_appearance_mode):
CTk.set_appearance_mode(new_appearance_mode)
def get_characters(self):
chars = "".join(self.cb_digits_var.get() + self.cb_lower_var.get()
+ self.cb_upper_var.get() + self.cb_symbols_var.get())
return chars if chars else ascii_lowercase + ascii_uppercase + digits
def set_password(self):
try:
length = int(self.password_length_entry.get())
if length < 8 or length > 50:
raise ValueError("Length out of range")
except ValueError:
messagebox.showerror("Invalid Input", "Password length must be between 8 and 50.")
return
characters = self.get_characters()
if not characters:
messagebox.showwarning("Warning", "Please select at least one character set!")
return
self.entry_password.delete(0, 'end')
self.entry_password.insert(0, password.create_new(length=length, characters=characters))
def copy_password(self):
password = self.entry_password.get()
if password:
pyperclip.copy(password)
messagebox.showinfo("Success", "Password copied to clipboard!")
else:
messagebox.showwarning("Warning", "No password to copy!")
def save_password(self):
password = self.entry_password.get()
if password:
with open("passwords.txt", "a") as file:
file.write(password + "\n")
messagebox.showinfo("Success", "Password saved to passwords.txt!")
else:
messagebox.showwarning("Warning", "No password to save!")
if __name__ == "__main__":
app = App()
app.mainloop()