Skip to content

Commit 29aa869

Browse files
authored
Big changes in the main code.
Big changes in the main code, added copy directly clicking on the labels, optimization and bug fixes as well.
1 parent 7d60618 commit 29aa869

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

main.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
class PasswordGenerator:
1515
def __init__(self):
1616
self.app = tk.Tk()
17-
self.app.title("Memorable Password Generator")
17+
self.app.title("SafePass - Password Generator")
1818
self.app.resizable(width=False, height=False)
1919
self.style = ttk.Style()
2020
self.style.theme_use("xpnative")
@@ -23,6 +23,8 @@ def __init__(self):
2323
self.numbers_var = tk.BooleanVar()
2424
self.special_chars_var = tk.BooleanVar(value=True)
2525
self.test_button = tk.Button(text="Test")
26+
self.passphrases = [] # store the passphrases separately
27+
self.passphrase_labels = [] # store the labels separately
2628
self.create_widgets()
2729

2830
def toggle_multiple_passphrases(self):
@@ -34,7 +36,7 @@ def toggle_multiple_passphrases(self):
3436
self.num_passphrases_label.grid_forget()
3537
self.num_passphrases_spinbox.grid_forget()
3638
self.num_passphrases_spinbox.config(state="disabled")
37-
39+
3840
def create_widgets(self):
3941
num_words_label = ttk.Label(self.app, text="Number of words:")
4042
num_words_label.grid(row=0, column=0, padx=10, pady=5, sticky="w")
@@ -60,12 +62,6 @@ def create_widgets(self):
6062
generate_button = ttk.Button(self.app, text="Generate", command=self.generate_button_clicked)
6163
generate_button.grid(row=4, column=0, columnspan=2, padx=10, pady=10)
6264

63-
self.passphrase_label = ttk.Label(self.app, text="", wraplength=300)
64-
self.passphrase_label.grid(row=5, column=0, columnspan=2, padx=10, pady=5)
65-
66-
self.copy_button = ttk.Button(self.app, text="Copy", command=self.copy_to_clipboard, state=tk.DISABLED)
67-
self.copy_button.grid(row=6, column=0, columnspan=2, padx=10, pady=5)
68-
6965
self.strength_label = ttk.Label(self.app, text="", wraplength=300)
7066
self.strength_label.grid(row=7, column=0, columnspan=2, padx=10, pady=5)
7167

@@ -76,8 +72,6 @@ def create_widgets(self):
7672
self.feedback_crack_time.grid(row=9, column=0, columnspan=2, padx=10, pady=5)
7773

7874
self.toggle_multiple_passphrases()
79-
80-
8175

8276
def generate_passphrase(self, num_words, add_numbers, add_special_chars, min_digits=1, max_digits=4, capitalize_percentage=60, include_spaces=True):
8377
words = [secrets.choice(wordlist).capitalize() for _ in range(num_words)]
@@ -103,7 +97,7 @@ def generate_passphrase(self, num_words, add_numbers, add_special_chars, min_dig
10397
return passphrase
10498

10599
raise RuntimeError(f'Unable to generate a secure passphrase after attempts')
106-
100+
107101
def generate_button_clicked(self):
108102
num_words = self.num_words_entry.get()
109103
if num_words is None or num_words == "":
@@ -125,9 +119,17 @@ def generate_button_clicked(self):
125119

126120
for i in range(num_passphrases):
127121
passphrases.append(self.generate_passphrase(num_words, self.numbers_var.get(), self.special_chars_var.get(), include_spaces=self.include_spaces.get()))
128-
129-
self.passphrase_label.config(text="\n".join([f"Passphrase {i+1}: {passphrase}" for i, passphrase in enumerate(passphrases)]))
130-
self.copy_button.config(state=tk.NORMAL)
122+
#Destroy previous labels, so it does not overlap.
123+
for label in self.passphrase_labels:
124+
label.destroy()
125+
126+
self.passphrases = passphrases # store the passphrases
127+
self.passphrase_labels = [] # clear the old labels
128+
for i, passphrase in enumerate(passphrases):
129+
label = ttk.Label(self.app, text=f"Passphrase {i+1}: {passphrase}", wraplength=300)
130+
label.grid(row=5+i, column=0, columnspan=2, padx=10, pady=5)
131+
label.bind("<Button-1>", self.copy_to_clipboard) # bind click event
132+
self.passphrase_labels.append(label) # store the label
131133

132134
strength_result = test_password(passphrases[0])
133135
self.strength_label.config(text=f"Password Strength: {strength_result['score']}/4")
@@ -137,13 +139,20 @@ def generate_button_clicked(self):
137139
except ValueError as e:
138140
messagebox.showerror("Error", f"An error occurred while generating the passphrase:\n{e}")
139141

140-
def copy_to_clipboard(self):
141-
passphrase = self.passphrase_label.cget("text").split(": ")[1]
142+
def copy_to_clipboard(self, event=None):
143+
# get the index of the clicked label
144+
label_index = self.passphrase_labels.index(event.widget)
145+
# get the corresponding passphrase
146+
passphrase = self.passphrases[label_index]
142147
pyperclip.copy(passphrase)
143148
threading.Timer(clear_duration, clear_clipboard).start()
144149

150+
# provide visual feedback
151+
event.widget.config(foreground="green")
152+
self.app.after(2000, lambda: event.widget.config(foreground="black")) # change color back after 2 seconds
153+
145154
def run(self):
146155
self.app.mainloop()
147156

148157
if __name__ == "__main__":
149-
PasswordGenerator().run()
158+
PasswordGenerator().run()

0 commit comments

Comments
 (0)