From 19bf62fc079cef97f4c8693c4849107be873bd9a Mon Sep 17 00:00:00 2001 From: Raihan Khan Date: Sun, 9 Oct 2022 11:05:49 +0530 Subject: [PATCH] fixed #220 --- scripts/Password Manager App/logo.png | Bin 0 -> 14111 bytes scripts/Password Manager App/main.py | 124 ++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 scripts/Password Manager App/logo.png create mode 100644 scripts/Password Manager App/main.py diff --git a/scripts/Password Manager App/logo.png b/scripts/Password Manager App/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..59b69165150928c6e4ae4ce95ec190c7b62636ee GIT binary patch literal 14111 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 literal 0 HcmV?d00001 diff --git a/scripts/Password Manager App/main.py b/scripts/Password Manager App/main.py new file mode 100644 index 0000000..e555e23 --- /dev/null +++ b/scripts/Password Manager App/main.py @@ -0,0 +1,124 @@ +from tkinter import * +from tkinter import messagebox +from random import choice, randint, shuffle +import json + + +# ---------------------------- PASSWORD GENERATOR ------------------------------- # + +def generate_password(): + letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', + 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] + numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] + symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+'] + + password_letters = [choice(letters) for _ in range(randint(8, 10))] + password_symbols = [choice(symbols) for _ in range(randint(2, 4))] + password_numbers = [choice(numbers) for _ in range(randint(2, 4))] + + password_list = password_letters + password_symbols + password_numbers + + shuffle(password_list) + + password = "".join(password_list) + password_entry.delete(0, END) + password_entry.insert(0, password) + + +# ---------------------------- SAVE PASSWORD ------------------------------- # + +def save(): + website = website_entry.get() + email = email_entry.get() + password = password_entry.get() + new_data = { + website: { + "email": email, + "password": password, + } + } + + if len(website) == 0 or len(password) == 0: + messagebox.showinfo(title="Oops", message="Please make sure you haven't left any fields empty") + else: + try: + with open("data.json", "r") as data_file: + data = json.load(data_file) + + except FileNotFoundError: + with open("data.json", "w") as data_file: + json.dump(new_data, data_file, indent=4) + + else: + data.update(new_data) + + with open("data.json", "w") as data_file: + json.dump(data, data_file, indent=4) + + finally: + website_entry.delete(0, END) + password_entry.delete(0, END) + + + + +# ---------------------------- UI SETUP ------------------------------- # + +def find_password(): + website = website_entry.get() + try: + with open("data/data.json") as data_file: + data = json.load(data_file) + except FileNotFoundError: + messagebox.showinfo(title="Error", message="No Data File Found.") + else: + if website in data: + email = data[website]["email"] + password = data[website]["password"] + messagebox.showinfo(title=website, message=f"Website: {website}\nEmail: {email}\nPassword: {password}") + else: + messagebox.showinfo(title="Error", message=f"No details for {website} exists.") + + + + + +# ---------------------------- UI SETUP ------------------------------- # + +window = Tk() +window.title("Password Manager") +window.config(padx=50, pady=50) + +canvas = Canvas(height=200, width=200) +logo_img = PhotoImage(file="logo.png") +canvas.create_image(100, 100, image=logo_img) +canvas.grid(row=0, column=1) + +# Labels +website_label = Label(text="Website") +website_label.grid(row=1, column=0) +email_label = Label(text="Email/Username") +email_label.grid(row=2, column=0) +password_label = Label(text="Password") +password_label.grid(row=3, column=0) + +# Entries +website_entry = Entry(width=21) +website_entry.grid(row=1, column=1) +website_entry.focus() +email_entry = Entry(width=35) +email_entry.grid(row=2, column=1, columnspan=2) +email_entry.insert(0, "iamrk98@gmail.com") +password_entry = Entry(width=21) +password_entry.grid(row=3, column=1) + +# Buttons +generate_password_button = Button(text="Generate Password", command=generate_password) +generate_password_button.grid(row=3, column=2) +search_button = Button(text="Search", width=10, command=find_password) +search_button.grid(row=1, column=2) +add_button = Button(text="Add", width=36, command=save) +add_button.grid(row=4, column=1, columnspan=2) + +window.mainloop()