class ListWidget: def __init__(self, command=None): self.topic_list = None outsideFrame = Frame() outsideFrame.config(padx=10, pady=10) outsideFrame.grid(row=1, column=0, sticky="wn") self.frame = LabelFrame(outsideFrame, text="Topics") self.frame.config(font=("Arial", 14), padx=10, pady=10) self.frame.grid(row=0, column=0) self._command = command self.topic_filter_input = Entry(self.frame, width=33) self.topic_filter_input.grid(row=0, column=0, pady=10) self.topic_filter_input.bind("<KeyRelease>", self.filter_topic) treeFrame = Frame(self.frame) treeFrame.grid(row=1, column=0) self.tree = Treeview(treeFrame, style="Custom.Treeview") self.tree.heading('#0', text='Topic') self.tree.pack() self.tree.bind("<ButtonRelease-1>", self.OnClick) self.tree.tag_configure('odd', background='#f9f9f9') self.tree.tag_configure('even', background='#DFDFDF') scroll_bar = Scrollbar(self.frame, orient="vertical", command=self.tree.yview) scroll_bar.grid(row=1, column=1, sticky='nsew') self.tree.configure(yscrollcommand=scroll_bar.set) def filter_topic(self, *args): inputed_topic = self.topic_filter_input.get() list = filter(lambda k: inputed_topic.lower() in k.lower(), self.topic_list) self.prepare_list(list) def OnClick(self, event): item = self.tree.identify('item', event.x, event.y) if item == '': return selectedItem = self.tree.item(item, "text") self._command(selectedItem) def prepare_list(self, sorted_topic_list): self.clean() for topic in sorted_topic_list: self.insert(topic) def insert(self, line): type = 'even' if (len(self.tree.get_children()) % 2 == 1): type = 'odd' self.tree.insert("", "end", text=line, tags=(type, )) def clean(self): for i in self.tree.get_children(): self.tree.delete(i) def destroy(self): self.frame.destroy()
class System(Login_window): def __init__(self, master, colour): try: os.mkdir("Employee") os.mkdir("Department") except FileExistsError: print("Directory already exists") else: pass self.__logged = Toplevel(master) First.__init__(self, self.__logged, colour) self.frame1 = LabelFrame(self.__logged) self.frame1.pack() self.employee_name = StringVar() self.mail = StringVar() self.employee_code = StringVar() self.department_code = StringVar() self.department_name = StringVar() self.employee_surname = StringVar() frame = Frame(self.__logged, padx=15, pady=15) frame.place(x=400, y=200) Button(frame, text="Employee Details", font=("Calibri", 13), width=20, pady=15, command=lambda: (self.frame1.destroy(), frame.pack(side="left"), System.detail_employee(self))).pack() Button(frame, text="Add Employee", font=("Calibri", 13), width=20, pady=15, command=lambda: (self.frame1.destroy(), frame.pack(side="left"), System.add_employee(self))).pack() Button(frame, text="Department Details", font=("Calibri", 13), width=20, pady=15, command=lambda: ( self.frame1.destroy(), frame.pack(side="left"), System.detail_department(self))).pack() Button(frame, text="Add Department", font=("Calibri", 13), width=20, pady=15, command=lambda: (self.frame1.destroy(), frame.pack(side="left"), System.add_department(self))).pack() Button(self.__logged, text="Back", width=15, pady=10, command=lambda: (main.deiconify(), self.__logged.destroy())).pack() def add_employee(self): self.frame1 = Frame(self.__logged, width="400", height="400", padx=10, pady=10) Label(self.frame1, text="Add Employee", bg="Red", fg="Light Grey", height="3", font=("Didot", 13)).grid( row=0, column=0, columnspan=2, sticky=W + E) Label(self.frame1, text="First Name").grid(row=1, column=0, pady=10) self.employeename = Entry(self.frame1, textvariable=self.employee_name) self.employeename.grid(row=1, column=1, pady=10) Label(self.frame1, text="Last Name").grid(row=2, column=0, pady=10) self.employeesurname = Entry(self.frame1, textvariable=self.employee_surname) self.employeesurname.grid(row=2, column=1, pady=10) Label(self.frame1, text="Email").grid(row=3, column=0, pady=10) self.email = Entry(self.frame1, textvariable=self.mail) self.email.grid(row=3, column=1, pady=10) Label(self.frame1, text="Employee Code").grid(row=4, column=0, pady=10) self.employeecode = Entry(self.frame1, textvariable=self.employee_code) self.employeecode.grid(row=4, column=1, pady=10) Label(self.frame1, text="Department Code").grid(row=5, column=0, pady=10) self.departmentcode = Entry(self.frame1, textvariable=self.department_code) self.departmentcode.grid(row=5, column=1, pady=10) Label(self.frame1, text="Department Name").grid(row=6, column=0, pady=10) self.department = Entry(self.frame1, textvariable=self.department_name) self.department.grid(row=6, column=1, pady=10) print("adding employee") System.reset(self) Button(self.frame1, text="Submit", command=lambda: System.submit(self, self.employee_name.get(), self.employee_surname.get(), self.employee_code.get(), self.mail.get(), self.department_name.get(), self.department_code.get())).grid(row=7, column=0, columnspan=2) Button(self.frame1, text="Reset", command=lambda: System.reset(self)).grid(row=8, column=0, columnspan=2) self.frame1.pack(side="left", padx=100) def detail_employee(self): self.frame1 = LabelFrame(self.__logged, width="700", height="600", padx=5, pady=5) Label(self.frame1, text="First Name").grid(row=0, column=0) Label(self.frame1, text="Last Name").grid(row=0, column=1) Label(self.frame1, text="Employee Code").grid(row=0, column=2) Label(self.frame1, text="Email Address").grid(row=0, column=3) Label(self.frame1, text="Department Name").grid(row=0, column=4) Label(self.frame1, text="Department Code").grid(row=0, column=5) list_department = os.listdir("Employee/") x = 0 for i in list_department: x += 1 __file = open("Employee/" + i, "r") Label(self.frame1, text=__file.readline().replace("First Name:", "")).grid(row=x, column=0) Label(self.frame1, text=__file.readline().replace("Last Name:", "")).grid(row=x, column=1) Label(self.frame1, text=__file.readline().replace("Code:", "")).grid(row=x, column=2) Label(self.frame1, text=__file.readline().replace("Email:", "")).grid(row=x, column=3) Label(self.frame1, text=__file.readline().replace("Department:", "")).grid(row=x, column=4) Label(self.frame1, text=__file.readline().replace("Department Code:", "")).grid(row=x, column=5) __file.close() self.frame1.pack(side="left", padx=75, pady=15, fill=BOTH) def add_department(self): self.frame1 = Frame(self.__logged, width="400", height="400", padx=10, pady=10) Label(self.frame1, text="Add Department", bg="Red", fg="Light Grey", height="3", font=("Didot", 13)).grid( row=0, column=0, columnspan=2, sticky=W + E) Label(self.frame1, text="Department Code").grid(row=1, column=0, pady=10) self.departmentcode = Entry(self.frame1, textvariable=self.department_code) self.departmentcode.delete(0, END) self.departmentcode.insert(0, "*") self.departmentcode.grid(row=1, column=1, pady=10) Label(self.frame1, text="Department Name").grid(row=2, column=0, pady=10) self.department = Entry(self.frame1, textvariable=self.department_name) self.department.delete(0, END) self.department.insert(0, "*") self.department.grid(row=2, column=1, pady=10) Button(self.frame1, text="Submit", command=lambda: System.submit(self, department_name=self.department_name.get(), department_code=self.department_code.get())).grid(row=3, column=0, columnspan=2) Button(self.frame1, text="Reset", command=lambda: System.clear(self)).grid(row=4, column=0, columnspan=2) self.frame1.pack(side="left", padx=100) print("adding department") def detail_department(self): self.frame1 = LabelFrame(self.__logged, width="700", height="600", padx=5, pady=5) Label(self.frame1, text="Department Code").grid(row=0, column=0) Label(self.frame1, text="Department Name").grid(row=0, column=1) list_department = os.listdir("Department/") x = 0 for i in list_department: x += 1 Label(self.frame1, text=i[:-4]).grid(row=x, column=0) __file = open("Department/" + i, "r") Label(self.frame1, text=__file.readline().replace("Department:", "")).grid(row=x, column=1) __file.close() self.frame1.pack(side="left", padx=200, pady=15, fill=BOTH) print("detailing department") def clear(self): self.departmentcode.delete(0, END) self.department.delete(0, END) self.departmentcode.insert(0, "*") self.department.insert(0, "*") def reset(self): self.employeename.delete(0, END) self.employeesurname.delete(0, END) self.employeecode.delete(0, END) self.email.delete(0, END) self.departmentcode.delete(0, END) self.department.delete(0, END) self.employeename.insert(0, "*") self.employeesurname.insert(0, "*") self.employeecode.insert(0, "*") self.email.insert(0, "*") self.departmentcode.insert(0, "*") self.department.insert(0, "*") def submit(self, employee_name=None, employee_surname=None, employee_code=None, mail=None, department_name=None, department_code=None): try: department_code = int(department_code) except ValueError: messagebox.showerror("String Input", "Cant input string in code section") else: dic = { "First Name": employee_name, "Last Name": employee_surname, "Code": employee_code, "Email": mail, "Department": department_name, "Department Code": department_code } if dic['Code'] is None: try: dep = open(r"Department/" + str(department_code) + ".txt", "x") except FileExistsError: messagebox.showerror("Duplicate Department", "The department code already exists") else: for i, j in dic.items(): if j is not None: dep.write("{}:{}\n".format(i, j)) messagebox.showinfo("Department Added", "Department has been added") finally: System.clear(self) else: try: dep = open(r"Employee/" + str(employee_code) + ".txt", "x") except FileExistsError: messagebox.showerror("Duplicate Employee", "The employee code already exists") else: for i, j in dic.items(): if j is not None: dep.write("{}:{}\n".format(i, j)) messagebox.showinfo("Employee Added", "Employee has been added") finally: System.reset(self)
class App_Photo(object): """docstring for App_Photo""" def __init__(self, master, pil_photo, styles, root, fullsize_path, hide_cmd=None, del_cmd=None): super(App_Photo, self).__init__() self.master = master self.pil_photo = pil_photo self.fullsize_path = fullsize_path self.photo = PIL.ImageTk.PhotoImage(pil_photo) self.styles = styles self.tool_styles = styles.copy() self.tool_styles['big_font'] = styles['font'] self.tool_styles['padx'] = 5 self.tool_styles['pady'] = 3 self.root = root self.hide_cmd = hide_cmd self.del_cmd = del_cmd self.putPhoto() def putPhoto(self): self.wrapper = LabelFrame(self.master, bg=self.styles['bg'], borderwidth=0) self.photo_label = Label(self.wrapper, image=self.photo, borderwidth=0, cursor="hand2") self.photo_label.bind("<Button-1>", self.zoom) self.photo_label.bind("<Enter>", self.show_tools) self.photo_label.bind("<Leave>", self.hide_tools) self.photo_label.image = self.photo self.photo_label.pack() self.minimize_tool = App_Button(self.wrapper, text="➖", styles=self.tool_styles, command=self.hide_cmd) self.minimize_tool.bind_wrapper("<Enter>", self.show_tools) self.minimize_tool.place(x=0, y=0) self.minimize_tool.place_forget() self.delete_tool = App_Button(self.wrapper, text="✕", styles=self.tool_styles, command=self.del_cmd) self.delete_tool.bind_wrapper("<Enter>", self.show_tools) self.delete_tool.place(x=0, y=0) self.delete_tool.place_forget() self.overlay = LabelFrame(self.root, bg=self.styles['overlay'], fg=self.styles['overlay'], borderwidth=0) self.overlay_close = App_Button(self.overlay, text="⩁", title="Close the zoomed view", styles=self.styles, command=self.un_zoom) self.overlay_close.place(x=0, y=0) def zoom(self, event): window_width = self.root.winfo_width() window_height = self.root.winfo_height() self.overlay.config(width=window_width) self.overlay.config(height=window_height) self.overlay.place(x=0, y=0) zoomed_width = int(window_width * 0.8) zoomed_height = int(window_height * 0.8) pil_photo = PIL.Image.open(self.fullsize_path) wpercent = (zoomed_width/float(pil_photo.size[0])) hsize = int((float(pil_photo.size[1])*float(wpercent))) zoomed_pil_photo = pil_photo.resize((zoomed_width,hsize), PIL.Image.ANTIALIAS) hpercent = (zoomed_height/float(pil_photo.size[1])) wsize = int((float(pil_photo.size[0])*float(hpercent))) zoomed_pil_photo = pil_photo.resize((wsize,zoomed_height), PIL.Image.ANTIALIAS) zoomed_photo = PIL.ImageTk.PhotoImage(zoomed_pil_photo) self.zoomed_photo_label = Label(self.root, image=zoomed_photo, borderwidth=0) self.zoomed_photo_label.image = zoomed_photo self.zoomed_photo_label.pack() photo_x_pos = (window_width / 2) - (wsize / 2) photo_y_pos = (window_height / 2) - (zoomed_height / 2) overlay_close_width = self.overlay_close.winfo_width() self.overlay_close.place(x=window_width-overlay_close_width-25, y=25) self.zoomed_photo_label.place(x=photo_x_pos, y=photo_y_pos) def un_zoom(self): self.overlay.place_forget() self.zoomed_photo_label.place_forget() def show_tools(self, event): photo_x = self.photo_label.winfo_x() photo_y = self.photo_label.winfo_y() photo_width = self.photo_label.winfo_width() minimize_tool_width = self.minimize_tool.winfo_width() delete_tool_width = self.delete_tool.winfo_width() minimize_tool_x_pos = photo_x + photo_width - minimize_tool_width - delete_tool_width - 5 delete_tool_x_pos = photo_x + photo_width - delete_tool_width tool_y_pos = photo_y + 5 self.minimize_tool.place(x=minimize_tool_x_pos, y=tool_y_pos) self.delete_tool.place(x=delete_tool_x_pos, y=tool_y_pos) def hide_tools(self, event): self.minimize_tool.place_forget() self.delete_tool.place_forget() def bind(self, *args, **kwargs): self.wrapper.bind(*args, **kwargs) def pack(self, *args, **kwargs): self.wrapper.pack(*args, **kwargs) def destroy(self, *args, **kwargs): self.wrapper.destroy(*args, **kwargs)
class Frames: def __init__(self, master, frameName): """Contains global flags along with which frame to show initially.""" self.master = master self.showPassword = False self.passwordResetFrame = False self.newPasswordFrame = False self.TreeFrameEdit = False self.eyeImage = PhotoImage(file="imgs/eye.png") self.checkImage = PhotoImage(file="imgs/checkmark.png") self.cwd = getcwd() if frameName == 'setup': self.setup() else: self.login() # frames def setup(self): """Frame for first time using the Password Manager.""" # security questions SECQUESTIONS = [ 'What was your childhood nickname?', 'In what city or town did your mother and father meet?', 'What is your favorite team?', 'What was your favorite food as a child?', 'What was the name of the hospital where you were born?', 'What school did you attend for sixth grade?' ] # frame setupFrame = LabelFrame(self.master, text='Setup Your Account') setupFrame.pack() # widget init SecQvar = StringVar(setupFrame) SecQvar.set(SECQUESTIONS[0]) # widget mPassLabel = Label(setupFrame, text='Create a master password*: ') mPassEntry = Entry(setupFrame, width=45, show='*') previewBtn = Button(setupFrame, image=self.eyeImage, command=lambda: self.previewPassword(mPassEntry)) spacer = Label(setupFrame, text='') mSecLabel = Label(setupFrame, text='Choose a security question: ') mSecQs = OptionMenu(setupFrame, SecQvar, *SECQUESTIONS) mSecAnsLabel = Label(setupFrame, text='Answer to security question**: ') mSecAnsEntry = Entry(setupFrame, width=45) spacer = Label(setupFrame, text='') confBtn = Button( setupFrame, text='Sign Up', width=10, command=lambda: self.signUpSubmit(mPassEntry.get(), SecQvar.get( ), mSecAnsEntry.get(), setupFrame, 'login')) spacer = Label(setupFrame, text='') star1 = Label( setupFrame, text='* 6-20 characters, 1 UPPER, 1 lower, 1 num, no space.') star2 = Label(setupFrame, text='** Capitalization and spacing counts.') # widget pack mPassLabel.grid(row=0, column=0, sticky='e') mPassEntry.grid(row=0, column=1) previewBtn.grid(row=0, column=1, sticky='e') spacer.grid(row=1, column=0) mSecLabel.grid(row=2, column=0, sticky='e') mSecQs.grid(row=2, column=1, sticky='w') mSecAnsLabel.grid(row=3, column=0, sticky='e') mSecAnsEntry.grid(row=3, column=1) spacer.grid(row=4, column=1) confBtn.grid(row=5, column=1, sticky='e') spacer.grid(row=6, column=1) star1.grid(row=7, column=1, sticky='e') star2.grid(row=8, column=1, sticky='e') # widget bind previewBtn.image = self.eyeImage mPassEntry.bind( '<Return>', lambda x: self.signUpSubmit(mPassEntry.get( ), SecQvar.get(), mSecAnsEntry.get(), setupFrame, 'login')) mSecAnsEntry.bind( '<Return>', lambda x: self.signUpSubmit(mPassEntry.get( ), SecQvar.get(), mSecAnsEntry.get(), setupFrame, 'login')) def login(self): """Frame for logging into Password Manager using master password.""" # frame loginFrame = LabelFrame(self.master, text='Login To Your Account') loginFrame.pack() # widget loginLabel = Label(loginFrame, text='Enter your master password: '******'*') Spacer = Label(loginFrame, text='') loginBtn = Button( loginFrame, text='Log In', command=lambda: self.loginCheck(mLoginEntry.get(), loginFrame)) loginResetBtn = Button(loginFrame, text='Reset Password', command=lambda: self.showPasswordReset()) # widget pack loginLabel.grid(row=0, column=0) mLoginEntry.grid(row=0, column=1) Spacer.grid(row=1, column=0) loginBtn.grid(row=2, column=1, sticky='e') loginResetBtn.grid(row=2, column=0, sticky='w') # widget bind mLoginEntry.bind( '<Return>', lambda x: self.loginCheck(mLoginEntry.get(), loginFrame)) def resetPassword(self): """Frame for checking security answer for new master password.""" self.passwordResetFrame = True # frame self.resetPassFrame = LabelFrame(self.master, text='Password Reset') self.resetPassFrame.pack() # widget showSecQ = Label(self.resetPassFrame, text=ffunc.getSecQ()) spacer = Label(self.resetPassFrame, text='') secAnsLabel = Label(self.resetPassFrame, text='Answer:') secAnsEntry = Entry(self.resetPassFrame, width=50) resetCheckBtn = Button( self.resetPassFrame, text='Check', command=lambda: self.secCheck(secAnsEntry.get())) # widget pack showSecQ.grid(row=0, column=1) spacer.grid(row=1, column=2) secAnsLabel.grid(row=2, column=0) secAnsEntry.grid(row=2, column=1) resetCheckBtn.grid(row=2, column=3) # widget bind secAnsEntry.bind('<Return>', lambda x: self.secCheck(secAnsEntry.get())) def newPassword(self): """Frame for creating new master password.""" self.newPasswordFrame = True # frame self.newPassFrame = LabelFrame(self.master, text='Make A New Password') self.newPassFrame.pack() # widget newPassLabel = Label(self.newPassFrame, text='Create A New Master Password*') spacer = Label(self.newPassFrame, text='') newPassEntry = Entry(self.newPassFrame, width=45, show='*') previewBtn = Button(self.newPassFrame, image=self.eyeImage, command=lambda: self.previewPassword(newPassEntry)) submitBtn = Button( self.newPassFrame, text='Submit', command=lambda: self.resetSubmit(newPassEntry.get())) spacer = Label(self.newPassFrame, text='') starLabel = Label( self.newPassFrame, text='* 6-20 characters, 1 UPPER, 1 lower, 1 num, no space.') # widget pack newPassLabel.grid(row=0, column=0) spacer.grid(row=1, column=0) newPassEntry.grid(row=2, column=0) previewBtn.grid(row=2, column=1) submitBtn.grid(row=3, column=0, sticky='e') spacer.grid(row=4, column=0) starLabel.grid(row=5, column=0, sticky='w') # widget bind newPassEntry.bind('<Return>', lambda x: self.resetSubmit(newPassEntry.get())) def home(self): """Frames for creating and storing entries.""" # frame - adding entries self.homeFrame = LabelFrame(self.master, text='Add An Entry') self.homeFrame.grid(row=0, column=0) # widget - adding entries webLabel = Label(self.homeFrame, text='Website') userLabel = Label(self.homeFrame, text='Username') passLabel = Label(self.homeFrame, text='Password') webEntry = Entry(self.homeFrame, width=30) userEntry = Entry(self.homeFrame, width=30) passEntry = Entry(self.homeFrame, width=30) addEntryBtn = Button( self.homeFrame, image=self.checkImage, command=lambda: self.checkEntry(webEntry.get(), userEntry.get(), passEntry.get())) # widget pack - adding entries webLabel.grid(row=0, column=0) userLabel.grid(row=0, column=1) passLabel.grid(row=0, column=2) webEntry.grid(row=1, column=0) userEntry.grid(row=1, column=1) passEntry.grid(row=1, column=2) addEntryBtn.grid(row=1, column=3) # widget bind - adding entries addEntryBtn.image = self.checkImage passEntry.bind( '<Return>', lambda x: self.checkEntry(webEntry.get(), userEntry.get(), passEntry.get())) # frame - entries self.entriesFrame = Frame(self.master) self.entriesFrame.grid(row=1, column=0) # widget - adding toolbarLabel = Button(self.entriesFrame, text='Delete Selection', command=self.treeMenuDeleteSelected) self.entriesTree = Treeview(self.entriesFrame) self.showEntries() # inserts all rows # widget pack - adding toolbarLabel.grid(row=0, column=0, sticky='w', pady=(20, 5), padx=(5, 5)) self.entriesTree.grid(row=1, column=0) # widget bind - adding self.entriesTree.bind("<Double-1>", self.cpyEntry) self.entriesTree.bind("<Button-3>", self.popUp) # widget config - adding self.entriesTree['columns'] = (0, 1, 2) self.entriesTree['show'] = 'headings' self.entriesTree.column(0, anchor='center') self.entriesTree.column(1, anchor='center') self.entriesTree.column(2, anchor='center') self.entriesTree.heading(0, text='Website') self.entriesTree.heading(1, text='Username') self.entriesTree.heading(2, text='Password') self.entriesTree.tag_configure('even', background='#e3e3e3') treeScroll = Scrollbar(self.entriesFrame, orient="vertical", command=self.entriesTree.yview) self.entriesTree.configure(yscrollcommand=treeScroll.set) treeScroll.grid(row=1, column=1, sticky='NSEW') spacer = Label(self.entriesFrame, text='') spacer.grid(row=2, column=0) legendLabel = Label(self.entriesFrame, text='LEGEND:') legendLabel.grid(row=3, column=0, sticky='w') f = font.Font(legendLabel, legendLabel.cget("font")) f.configure(underline=True) legendLabel.configure(font=f) cpyPassword = Label(self.entriesFrame, text='- Double-click to copy password.') cpyPassword.grid(row=4, column=0, sticky='w') delRow = Label(self.entriesFrame, text='- Right-click for row options.') delRow.grid(row=5, column=0, sticky='w') def editEntry(self): """Frame for editing an entry.""" self.TreeFrameEdit = True # frame self.treeEditFrame = LabelFrame(self.master, text='Edit Entry') self.treeEditFrame.grid(row=2, column=0) # widget init item = self.entriesTree.selection() for i in item: website = self.entriesTree.item(i, "values")[0] username = self.entriesTree.item(i, "values")[1] itemInfo = self.rowsDecrypted[int(item[0])] curPass = itemInfo[2] # widget oldLabel = Label(self.treeEditFrame, text='Old Entry') newLabel = Label(self.treeEditFrame, text='New Entry') webLabel = Label(self.treeEditFrame, text='Website') userLabel = Label(self.treeEditFrame, text='Username') pwLabel = Label(self.treeEditFrame, text='Password') oldWebInfo = Label(self.treeEditFrame, text=website) oldUserInfo = Label(self.treeEditFrame, text=username) oldPwInfo = Label(self.treeEditFrame, text=curPass) newWeb = Entry(self.treeEditFrame, width=30) newUser = Entry(self.treeEditFrame, width=30) newPw = Entry(self.treeEditFrame, width=30) submitBtn = Button(self.treeEditFrame, text='Submit', command=lambda: self.editEntryCheck( item, newWeb.get(), newUser.get(), newPw.get())) # widget pack oldLabel.grid(row=0, column=1, sticky='w', padx=(0, 30)) newLabel.grid(row=0, column=2, sticky='w') webLabel.grid(row=1, column=0, sticky='e', padx=(0, 15)) userLabel.grid(row=2, column=0, sticky='e', padx=(0, 15)) pwLabel.grid(row=3, column=0, sticky='e', padx=(0, 15)) oldWebInfo.grid(row=1, column=1, sticky='w') oldUserInfo.grid(row=2, column=1, sticky='w') oldPwInfo.grid(row=3, column=1, sticky='w') newWeb.grid(row=1, column=2, sticky='w') newUser.grid(row=2, column=2, sticky='w') newPw.grid(row=3, column=2, sticky='w') submitBtn.grid(row=4, column=2, sticky='e') # widget bind newWeb.insert(0, website) newUser.insert(0, username) newPw.insert(0, curPass) # widget checks and configs def editEntryCheck(self, item, nw, nu, np): """Get new info for updating an entry.""" itemInfo = self.entriesInfo[int(item[0])] ow = itemInfo[0] ou = itemInfo[1] op = itemInfo[2] ffunc.editEntry(ow, ou, op, nw, nu, np) self.switchFrame((self.homeFrame, self.treeEditFrame), ('home', )) def showEntries(self): """Get entries decrypted from database and insert them into tree.""" rowInfo = ffunc.getEntries() self.rowsDecrypted = rowInfo[0] self.entriesInfo = rowInfo[1] i = 0 for row in self.rowsDecrypted: if i % 2 == 0: tag = 'even' else: tag = 'odd' self.entriesTree.insert('', i, values=(row[0], row[1], '-HIDDEN-'), iid=i, tags=(tag, i)) i += 1 def cpyEntry(self, event): """Double click to copy password.""" item = self.entriesTree.selection() for i in item: website = self.entriesTree.item(i, "values")[0] username = self.entriesTree.item(i, "values")[1] itemInfo = self.rowsDecrypted[int(item[0])] passwd = itemInfo[2] self.master.clipboard_clear() self.master.clipboard_append(passwd) def popUp(self, event): """Enable popup menu if right click is on an entry row.""" item = self.entriesTree.identify_row(event.y) if item: self.entriesTree.selection_set(item) self.treeMenu() self.popUpMenu.post(event.x_root, event.y_root) def treeMenu(self): """Create popup menu.""" def editCheck(): if not self.TreeFrameEdit: self.editEntry() else: self.switchFrame((self.treeEditFrame, ), ('editEntry', )) self.popUpMenu = Menu(self.entriesFrame, tearoff=0) self.popUpMenu.add_command(label='Copy Password', command=lambda: self.cpyEntry(0)) self.popUpMenu.add_command(label='Show Password', command=self.treeMenuShow) self.popUpMenu.add_command(label='Edit Entry', command=editCheck) self.popUpMenu.add_command(label='Delete Entry', command=self.treeMenuDelete) def treeMenuShow(self): """Show password - from popup menu.""" item = self.entriesTree.selection() for i in item: website = self.entriesTree.item(i, "values")[0] username = self.entriesTree.item(i, "values")[1] itemInfo = self.rowsDecrypted[int(item[0])] passwd = itemInfo[2] self.entriesTree.item(item, values=(website, username, passwd)) def treeMenuDelete(self): """Delete entry - from popup menu.""" item = self.entriesTree.selection() itemInfo = self.entriesInfo[int(item[0])] website = itemInfo[0] username = itemInfo[1] password = itemInfo[2] ffunc.removeEntry(website, username, password) if self.TreeFrameEdit: self.switchFrame((self.homeFrame, self.treeEditFrame), ('home', )) else: self.switchFrame((self.homeFrame, ), ('home', )) def treeMenuDeleteSelected(self): """Create confirmation window for multiple deletions - from popup menu.""" # window confirm = Toplevel() x = self.master.winfo_x() y = self.master.winfo_y() confirm.title('Offline Pass') confirm.geometry(f'+{x}+{y}') confirm.iconbitmap(self.cwd + '/imgs/favicon.ico') confirm.resizable(False, False) # widget init items = self.entriesTree.selection() itemInfo = self.entriesInfo[int(items[0])] # widget confirmLabel = Label(confirm, text='Are You Sure?') confirmYes = Button(confirm, text='Yes', command=lambda: self.checkDeleteSelected( items, self.entriesInfo, confirm)) confirmNo = Button(confirm, text='No', command=lambda: confirm.destroy()) # widget pack confirmLabel.grid(row=0, column=0) confirmYes.grid(row=1, column=1) confirmNo.grid(row=1, column=0) def checkDeleteSelected(self, items, oldInfo, window): """Delete multiple entries - from popup menu.""" ffunc.removeMultiEntry(items, oldInfo) if self.TreeFrameEdit: window.destroy() self.switchFrame((self.homeFrame, self.treeEditFrame), ('home', )) else: window.destroy() self.switchFrame((self.homeFrame, ), ('home', )) def signUpSubmit(self, password, question, answer, oF, nF): """Check if signup fields met.""" if ffunc.pushSignup(password, question, answer): self.switchFrame((oF, ), (nF, )) else: if answer == '': messagebox.showerror("Error", "Security Answer can't be empty.") else: messagebox.showerror("Error", "Password requirements not met.") def previewPassword(self, entry): """For previewing password input.""" if self.showPassword == False: entry.configure(show='') self.showPassword = True else: entry.configure(show='*') self.showPassword = False def loginCheck(self, password, loginFrame): """Check if other frames are active upon successful login.""" if ffunc.loginCmp(password): if self.passwordResetFrame and self.newPasswordFrame: self.switchFrame( (loginFrame, self.resetPassFrame, self.newPassFrame), ('home', )) elif self.passwordResetFrame: self.switchFrame((loginFrame, self.resetPassFrame), ('home', )) else: self.switchFrame((loginFrame, ), ('home', )) else: messagebox.showerror("Error", "Incorrect password.") def secCheck(self, answer): """Check if security question matches.""" if ffunc.secCmp(answer): self.switchFrame((self.resetPassFrame, ), ('newPassword', )) else: messagebox.showerror("Error", "Answer does not match.") return def resetSubmit(self, password): """Check if password requirements met.""" if ffunc.pushReset(password): self.newPassFrame.destroy() else: messagebox.showerror("Error", "Password requirements not met.") def checkEntry(self, web, user, passwd): """Check to make sure new entry has atleast the website field populated.""" if ffunc.pushEntry(web, user, passwd): self.switchFrame((self.homeFrame, ), ('home', )) else: messagebox.showerror("Error", "Website field can't be empty.") def showPasswordReset(self): """Check to make sure reset password frame is not already showing.""" if self.passwordResetFrame == False: self.resetPassword() else: return def switchFrame(self, oldFrame, newFrame): """Switch between different frames.""" for frame in oldFrame: frame.destroy() for frame in newFrame: getattr(Frames, frame)(self)