Beispiel #1
0
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()
Beispiel #2
0
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)
Beispiel #4
0
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)