From e3ce1ec42e879a78cec3afdf3fd9ef6c7c1c243f Mon Sep 17 00:00:00 2001 From: ironjunk Date: Wed, 19 Apr 2023 21:57:15 +0530 Subject: [PATCH] Added GUI : Generate Password --- favicon.png | Bin 0 -> 5202 bytes gui.py | 61 ++++++++++++++++++++++++++++++++++++++++++---------- main.py | 6 +++++- manager.py | 43 +++++++++++------------------------- 4 files changed, 68 insertions(+), 42 deletions(-) create mode 100644 favicon.png diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..322a8f6215d2c3a928044fcf2a5eda913b539228 GIT binary patch literal 5202 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 literal 0 HcmV?d00001 diff --git a/gui.py b/gui.py index 041142f..a599b0c 100644 --- a/gui.py +++ b/gui.py @@ -42,6 +42,13 @@ def btn_copy(text_field_1 = None): # ---------- Functions : GUI Renders +# func: to remove existing UI +def gui_remove(root = None): + + for widget in root.grid_slaves(): + if int(widget.grid_info()["row"]) >= 1: + widget.grid_forget() +# ---------- # func: to draw the UI for first time setup def gui_first_setup(root = None): @@ -72,22 +79,54 @@ def gui_first_setup(root = None): command = lambda: btn_first_setup(text_field_1 = text_field_1, text_field_2 = text_field_2, lbl_bottom = lbl_bottom)) btn_bottom.grid(row = 4, column = 0, columnspan = 2) # ---------- -# func: to draw the UI for first time setup -def gui_main_menu(root = None): +# func: to draw the UI for generate password tab +def gui_generate_password(root = None): + + gui_remove(root = root) text_field_1 = Entry(root, show = "*") - text_field_1.grid(row = 2, column = 0, columnspan = 2) + text_field_1.grid(row = 1, column = 1, columnspan = 2, pady = 20) + + btn_generate = Button(root, text = "Generate", + command = lambda: btn_generate_password(text_field_1 = text_field_1)) + btn_generate.grid(row = 1, column = 0, pady = 20) btn_cpy = Button(root, text = "Copy", command = lambda: btn_copy(text_field_1 = text_field_1)) - btn_cpy.grid(row = 2, column = 3) + btn_cpy.grid(row = 1, column = 3, pady = 20) +# ---------- +# func: to draw the UI for store password tab +def gui_store_password(root = None): + + gui_remove(root = root) +# ---------- +# ---------- +# func: to draw the UI for first time setup +def gui_main_menu(root = None): + + # text_field_1 = Entry(root, show = "*") + # text_field_1.grid(row = 1, column = 0, columnspan = 2) + + # btn_cpy = Button(root, text = "Copy", + # command = lambda: btn_copy(text_field_1 = text_field_1)) + # btn_cpy.grid(row = 1, column = 2) + + btn_menu_generate = Button(root, text = "Generate\nPassword", padx = 20, pady = 20, + command = lambda: gui_generate_password(root = root)) + btn_menu_generate.grid(row = 0, column = 0, pady = 20) + + btn_menu_store = Button(root, text = "Store\nPassword", padx = 20, pady = 20, + command = lambda: gui_store_password(root = root)) + btn_menu_store.grid(row = 0, column = 1, pady = 20) + + btn_menu_update = Button(root, text = "Update\nPassword", padx = 20, pady = 20) + btn_menu_update.grid(row = 0, column = 2, pady = 20) - btn_top_1 = Button(root, text = "Generate\nPassword", padx = 20, pady = 20, - command = lambda: btn_generate_password(text_field_1 = text_field_1)) - btn_top_1.grid(row = 0, column = 0) + btn_menu_retrieve = Button(root, text = "Retrieve\nPassword", padx = 20, pady = 20) + btn_menu_retrieve.grid(row = 0, column = 3, pady = 20) - btn_top_2 = Button(root, text = "Store\nPassword", padx = 20, pady = 20) - btn_top_2.grid(row = 0, column = 1) +# ---------- Main - btn_top_3 = Button(root, text = "Retrieve\nPassword", padx = 20, pady = 20) - btn_top_3.grid(row = 0, column = 2) \ No newline at end of file +if __name__ == "__main__": + + print("Error\t: Not a runnable program. \nNote\t: Run main.py instead.") \ No newline at end of file diff --git a/main.py b/main.py index 11b9d1e..de7c8ab 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ # ---------- Required Modules -from tkinter import Tk +from tkinter import Tk, PhotoImage from manager import check_status from gui import gui_first_setup, gui_main_menu @@ -17,6 +17,9 @@ root.title("Local Password Manager") root.geometry('500x300') + favicon = PhotoImage(file = "favicon.png") + root.iconphoto(False, favicon) + if not check_status(): gui_first_setup(root = root) else: @@ -30,6 +33,7 @@ root.grid_columnconfigure(0, weight = 1) root.grid_columnconfigure(1, weight = 1) root.grid_columnconfigure(2, weight = 1) + root.grid_columnconfigure(3, weight = 1) root.mainloop() diff --git a/manager.py b/manager.py index 826446c..8e4af5b 100644 --- a/manager.py +++ b/manager.py @@ -106,54 +106,37 @@ def check_master_pass(pass_master): # ---------- Scope: Update {Begin} ---------- # # ---------- Scope: Update {End} ---------- # -# ---------- Scope: Generate {Begin} ---------- # +# ---------- Generate Password # func: to generate password def generate(w = 4, W = 4, d = 3, s = 5): + # func: to jumble generated password + def jumble(gen): + + jumbled = sample(gen, len(gen)) + + return "".join(jumbled) spcl_char = "#_.@" gen = "" - for i in range(w): + for _ in range(w): gen = gen + chr(randint(97,122)) - for i in range(W): + for _ in range(W): gen = gen + chr(randint(65,90)) - for i in range(d): + for _ in range(d): gen = gen + chr(randint(48,57)) - for i in range(s): + for _ in range(s): gen = gen + spcl_char[randint(0,2)] return jumble(gen) -# func: to extract parameter values -def separate(value): - - return [int(x) for x in value] - -# func: to jumble generated password -def jumble(gen): - - jumbled = sample(gen, len(gen)) - - return "".join(jumbled) - -# ---------- Scope: Generate {End} ---------- # - -# ---------- Scope: Main {Begin} ---------- # +# ---------- Main if __name__ == "__main__": - print("Error : Not a runnable program. \nNote : Run lpm_main.py") - - - # value = input("Enter Value: ") - # w, W, d, s = separate(value) - - # pswd = generate(w, W, d, s) - # print(pswd) - -# ---------- Scope: Main {End} ---------- # \ No newline at end of file + print("Error\t: Not a runnable program. \nNote\t: Run main.py instead.") \ No newline at end of file