class AdminView(Tk): def __init__(self, username, lst_manager, lst_branch, callback1=None, callback2=None, callback3=None, callback4=None, callback5=None, callback6=None, callback7=None, callback8=None, callback9=None, callback10=None, callback11=None): super().__init__() self.username = username self.lst_manager = lst_manager self.lst_branch = lst_branch # callbacks: self.callback1 = callback1 # change_admin_info() self.callback2 = callback2 # new_branch() self.callback3 = callback3 # del_branch() self.callback4 = callback4 # change_branch() self.callback5 = callback5 # all_employees() self.callback6 = callback6 # all_customers() self.callback7 = callback7 # all_managers() self.callback8 = callback8 # new_manager() self.callback9 = callback9 # set_manager() self.callback10 = callback10 # change_manager() self.callback11 = callback11 # del_manager() self.title = f"Panel Admin: {self.username}" self.tabs = ttk.Notebook(self) self.tabs.grid(row=0, column=0) # Defining tabs self.tab_main = Frame(self) self.tab_main.grid(row=0, column=0) self.tab_managers = Frame(self) self.tab_managers.grid(row=0, column=0) self.tab_employees = Frame(self) self.tab_employees.grid(row=0, column=0) self.tab_customers = Frame(self) self.tab_customers.grid(row=0, column=0) self.tab_branches = Frame(self) self.tab_branches.grid(row=0, column=0) self.tabs.add(self.tab_main, text="Main") # Defining "tab Main" frames self.fr_side = Frame(self.tab_main) self.fr_side.grid(row=0, column=0) self.fr_details = Frame(self.tab_main) self.fr_details.grid(row=0, column=1) # Frame side self.lbl_manager = tk.Label(self.fr_side, text="Managers:") self.lbl_manager.grid(row=18, column=1, padx=10, pady=10) self.lbl_mng_num = tk.Button(self.fr_side, text="not set yet", command=self.open_managers) self.lbl_mng_num.grid(row=18, column=2, padx=10, pady=10) self.lbl_employees = tk.Label(self.fr_side, text="Employees:") self.lbl_employees.grid(row=16, column=1, padx=10, pady=10) self.lbl_emp_num = tk.Button(self.fr_side, text="not set yet", command=self.open_employees) self.lbl_emp_num.grid(row=16, column=2, padx=10, pady=10) self.lbl_customers = tk.Label(self.fr_side, text="Customers:") self.lbl_customers.grid(row=14, column=1, padx=10, pady=10) self.lbl_ct_num = tk.Button(self.fr_side, text="not set yet", command=self.open_customers) self.lbl_ct_num.grid(row=14, column=2, padx=10, pady=10) self.lbl_branches = tk.Label(self.fr_side, text="Branches: ") self.lbl_branches.grid(row=20, column=1, padx=10, pady=10) self.lbl_br_num = tk.Button(self.fr_side, text="not set yet", command=self.open_branches) self.lbl_br_num.grid(row=20, column=2, padx=10, pady=10) self.lbl_mng_num.bind("<Double-1>", self.open_managers) self.lbl_emp_num.bind("<Double-1>", self.open_employees) self.lbl_ct_num.bind("<Double-1>", self.open_customers) self.lbl_br_num.bind("<Double-1>", self.open_branches) # Frame details: self.lf_now = tk.LabelFrame(self.fr_details, text="This month") self.lf_now.grid(row=0, column=0, padx=10, pady=10) self.lf_past = tk.LabelFrame(self.fr_details, text="Last month") self.lf_past.grid(row=1, column=0, padx=10, pady=10) self.lbl_tf = tk.Label(self.lf_now, text="Transfer income") self.lbl_tf.grid(row=0, column=0, padx=10, pady=10) self.amount_tf = tk.Label(self.lf_now, text="not set yet") self.amount_tf.grid(row=1, column=0, padx=10, pady=10) self.lbl_acc_prof = tk.Label(self.lf_now, text="Accounts") self.lbl_acc_prof.grid(row=0, column=1, padx=10, pady=10) self.amount_acc_prof = tk.Label(self.lf_now, text="not set yet") self.amount_acc_prof.grid(row=1, column=1, padx=10, pady=10) self.lbl_salaries = tk.Label(self.lf_now, text="Salaries") self.lbl_salaries.grid(row=0, column=2, padx=10, pady=10) self.amount_salaries = tk.Label(self.lf_now, text="not set yet") self.amount_salaries.grid(row=1, column=2, padx=10, pady=10) self.lbl_income = tk.Label(self.lf_now, text="Gross profit") self.lbl_income.grid(row=0, column=3, padx=10, pady=10) self.amount_income = tk.Label(self.lf_now, text="not set yet") self.amount_income.grid(row=1, column=3, padx=10, pady=10) self.lbl_netp = tk.Label(self.lf_now, text="Net profit") self.lbl_netp.grid(row=0, column=4, padx=10, pady=10) self.amount_netp = tk.Label(self.lf_now, text="not set yet") self.amount_netp.grid(row=1, column=4, padx=10, pady=10) #### self.lbl_tf_last = tk.Label(self.lf_past, text="Transfer income") self.lbl_tf_last.grid(row=0, column=0, padx=10, pady=10) self.amount_tf_last = tk.Label(self.lf_past, text="not set yet") self.amount_tf_last.grid(row=1, column=0, padx=10, pady=10) self.lbl_acc_prof_last = tk.Label(self.lf_past, text="Accounts") self.lbl_acc_prof_last.grid(row=0, column=1, padx=10, pady=10) self.amount_acc_prof_last = tk.Label(self.lf_past, text="not set yet") self.amount_acc_prof_last.grid(row=1, column=1, padx=10, pady=10) self.lbl_salaries_last = tk.Label(self.lf_past, text="Salaries") self.lbl_salaries_last.grid(row=0, column=2, padx=10, pady=10) self.amount_salaries_last = tk.Label(self.lf_past, text="not set yet") self.amount_salaries_last.grid(row=1, column=2, padx=10, pady=10) self.lbl_income_last = tk.Label(self.lf_past, text="Gross profit") self.lbl_income_last.grid(row=0, column=3, padx=10, pady=10) self.amount_income_last = tk.Label(self.lf_past, text="not set yet") self.amount_income_last.grid(row=1, column=3, padx=10, pady=10) self.lbl_netp_last = tk.Label(self.lf_past, text="Net profit") self.lbl_netp_last.grid(row=0, column=4, padx=10, pady=10) self.amount_netp_last = tk.Label(self.lf_past, text="not set yet") self.amount_netp_last.grid(row=1, column=4, padx=10, pady=10) self.fr_aboutme = tk.LabelFrame(self.tab_main, text="About me", bg="gray") self.fr_aboutme.grid(row=11, column=0, rowspan=2, padx=10) self.lbl_name = tk.Label(self.fr_aboutme, text=self.username) self.lbl_name.grid(row=12, column=1, sticky="w", padx=10, pady=5) self.lbl_username = tk.Label(self.fr_aboutme, text="Username:"******"w", padx=10, pady=5) self.lbl_username = tk.Label(self.fr_aboutme, text=self.username) self.lbl_username.grid(row=12, column=1, sticky="w", padx=10, pady=5) self.btn_edit_me = Button(self.fr_aboutme, text="Edit", command=self.change_my_info, relief=tk.GROOVE) self.btn_edit_me.grid(row=2, column=0, columnspan=2, pady=5) ### #self.btn_showall = Button(self.fr_showall, text = "show all",command = self.showall) #self.btn_showall.grid(row = 2, column = 0) def open_managers(self): a = self.tabs.add(self.tab_managers, text="Managers") if a != []: return None panel = EditManager(self.tab_open_managers, self.callback10, self.close_tab, self.msg_err) self.tabs.add(self.tab_open_managers, text="Managers") print("managers opened") def open_employees(self): self.tabs.add(self.tab_employees, text="Employees") print("employees opened") def open_customers(self): self.tabs.add(self.tab_customers, text="Customers") print("customers opened") def open_branches(self, ): a = self.tabs.add(self.tab_branches, text="Branches") if a != []: return None panel = EditBranch(self.tab_open_branches, self.callback3, self.close_tab, self.msg_err) self.tabs.add(self.tab_branches, text="Branches") print("branches opened") def change_my_info(self): b = self.tab_change_my_info.winfo_b() if b != []: return None panel = Change_my_info(self.username, self.tab_change_my_info, self.callback1, self.close_tab, self.msg_err) self.tabs.add(self.tab_change_my_info, text="Edit-me menu") def run(self): self.mainloop() def close(self): self.destroy() def msg_err(self, title=None, msg=None, master=None): if master is None: master = self tk.messagebox.showerror(title, msg, parent=master)
class ManagerView(Tk): ''' This class creates manager panel. Access to: edit_user_view panel edit_me_view panel add_user_view panel ''' def __init__(self, name, username, list_employees, callback1 = None, callback2 = None, callback3 = None, callback4 = None, callback5 = None, callback6 = None): super().__init__() self.name = name self.username = username self.list_employees = list_employees self.callback1 = callback1 # add_employee() self.callback2 = callback2 # del_employee() self.callback3 = callback3 # change_employee() self.callback4 = callback4 # open_employee_panel() self.callback5 = callback5 # search() self.callback6 = callback6 # set_my_info() self.title(f"Panel manager: {self.name}") #self.icon (may add it) self.resizable(False, False) self.tabs = ttk.Notebook(self) self.tabs.grid(row = 0, column = 0) self.tab_main = Frame(self) self.tab_main.grid(row = 0, column = 0) self.tab_edit_me = Frame(self) self.tab_edit_me.grid(row = 0, column = 0) self.tab_add_user = Frame(self) self.tab_add_user.grid(row = 0, column = 0) self.tab_edit_user = Frame(self) self.tab_edit_user.grid(row = 0, column = 0) self.tabs.add(self.tab_main, text = "Main menu") # Defining Tab-main frames self.fr_aboutme = tk.LabelFrame(self.tab_main, text = "About me", bg = "#00a693") self.fr_aboutme.grid(row = 0, column = 0, rowspan = 2, padx = 10) self.fr_seachbar = Frame(self.tab_main) self.fr_seachbar.grid(row = 0, column = 1) self.fr_treev = Frame(self.tab_main) self.fr_treev.grid(row = 1, column = 1) self.fr_edit = Frame(self.tab_main) self.fr_edit.grid(row = 1, column = 2) # Frame about self.lbl_name = Label(self.fr_aboutme, text = "Name:") self.lbl_name.grid(row = 0, column = 0, sticky = "w", padx = 10, pady = 5) self.lbl_name = Label(self.fr_aboutme, text = self.name) self.lbl_name.grid(row = 0, column = 1, sticky = "w", padx = 10, pady = 5) self.lbl_username = Label(self.fr_aboutme, text = "Username:"******"w", padx = 10, pady = 5) self.lbl_username = Label(self.fr_aboutme, text = self.username) self.lbl_username.grid(row = 1, column = 1, sticky = "w", padx = 10, pady = 5) self.btn_edit_me = Button(self.fr_aboutme, text = "Edit", command = self.edit_me, relief = tk.GROOVE) self.btn_edit_me.grid(row = 2, column = 0, columnspan = 2, pady = 5) # Frame search bar self.search_bar = tk.Entry(self.fr_seachbar, width = 21) self.search_bar.grid(row = 0, column = 0, pady = 10) self.search_bar.bind("<Return>", lambda _: self.btn_search.invoke()) self.btn_search = Button(self.fr_seachbar, text = "search", command = self.search_treev) self.btn_search.grid(row = 0, column = 1, padx = 5) self.btn_refresh = Button(self.fr_seachbar, text = "Refresh", command = self.refresh_treev) self.btn_refresh.grid(row = 0, column = 2) # Frame list self.users_treev = ttk.Treeview(self.fr_treev, selectmode = 'browse', height = 15) self.users_treev.grid(row = 0, column = 0) self.users_treev['columns'] = ("1", "2") self.users_treev["show"] = "headings" self.users_treev.column("1", width = 140, anchor ='c') self.users_treev.column("2", width = 140, anchor ='c') self.users_treev.heading("1", text ="Name", command = lambda: \ self.treev_cl_sort("1", False)) self.users_treev.heading("2", text ="Username", command = lambda: \ self.treev_cl_sort("2", False)) self.scrollbar = ttk.Scrollbar(self.fr_treev, command = self.users_treev.yview, orient = tk.VERTICAL) self.scrollbar.grid(row = 0, column = 1) self.users_treev.configure(xscrollcommand = self.scrollbar.set) # Frame edit self.btn_add_user = Button(self.fr_edit, text = "Add user", command = self.add_user) self.btn_add_user.grid(row = 0, column = 0) self.btn_edit_user = Button(self.fr_edit, text = "Edit user", command = self.edit_user) self.btn_edit_user.grid(row = 1, column = 0, pady = 10, padx = 10) self.btn_delete_user = Button(self.fr_edit, text = "Delete user", command = self.del_user) self.btn_delete_user.grid(row = 2, column = 0) for user in self.list_employees: self.users_treev.insert("", "end", values = user) self.users_treev.bind("<Double-1>", self.onDoubleClick) def onDoubleClick(self, event): ''' assigning a double-click function to treev to open their panel. ''' user = self.users_treev.selection() if user == (): # double click on headings or any other empty space return None name, username = self.users_treev.item(user)["values"] # =(name, user) if self.callback4: self.callback4(username) self.users_treev.selection_remove(user[0]) # clear selection def edit_me(self): children = self.tab_edit_me.winfo_children() if children != []: # if a edit_view panel is open then ignore. return None panel = EditMeView(self.username, self.tab_edit_me, self.callback6, self.close_tab, self.msg_err) self.tabs.add(self.tab_edit_me, text = "Edit-me menu") def add_user(self): children = self.tab_add_user.winfo_children() if children != []: # if a edit_view panel is open then ignore. return None panel = AddUserView(self.tab_add_user, self.callback1, self.close_tab, self.msg_err) self.tabs.add(self.tab_add_user, text = "Add-user") def del_user(self): selected = self.users_treev.focus() # returns selected item ID if selected == "": # nothig selected, but btn is ckicked return None name, username = self.users_treev.item(selected, "values") self.users_treev.delete(selected) if self.callback2: self.callback2(username, self.msg_err) # update self.list_emplyees def edit_user(self): ''' first delete any opened tab for editing and then open new tab for edit ''' children = self.tab_edit_user.winfo_children() if children != []: for widget in children: # wiget = last EditUserView() widget.destroy() selected = self.users_treev.focus() if selected == "": # nothig selected, but btn is ckicked return None name, username = self.users_treev.item(selected, "values") panel = EditUserView(name, username, self.tab_edit_user, self.callback3, self.close_tab, self.msg_err) self.tabs.add(self.tab_edit_user, text = f"Edit {name}") # update self.list_employees (update by order of main.py). # update treeview. call refresh_treev after list update. self.users_treev.selection_remove(selected) def refresh_treev(self): '''simply deletes the entire treev and inserts items again''' self.users_treev.delete(*self.users_treev.get_children()) for user in self.list_employees: self.users_treev.insert("", "end", values = user) def search_treev(self): ''' gets anythin in self.search_bar and send to main.py. self.msg_err if nothing was found ''' text = self.search_bar.get() if self.callback5: matched_items = self.callback5(text) if len(matched_items) > 0: self.users_treev.delete(*self.users_treev.get_children()) for item in matched_items: self.users_treev.insert("", "end", values = item) else: self.msg_err("Error", "User not found") def treev_cl_sort(self, col, reverse): ''' click on each heading to sort by the values of it.''' users = [(self.users_treev.set(id_, col), id_) \ for id_ in self.users_treev.get_children()] # users = [(value 1, id-row 1), (value 2, id-row 2), ...] users.sort(reverse = reverse) # sorted by values. not row-id ! for index, (val, id_) in enumerate(users): self.users_treev.move(id_, '', index) self.users_treev.heading(col, command=lambda: \ self.treev_cl_sort(col, not reverse)) def close_tab(self): ''' just closing the tab. used as callback for all tabs like edit_view, edit_me, etc. ''' self.tabs.forget(self.tabs.select()) def run(self): self.mainloop() def close(self): self.destroy() def msg_err(self, title = None, msg = None, master = None): if master is None: master = self tk.messagebox.showerror(title, msg, parent = master)
class Accounts_view(Frame): def __init__(self, id_, master=None, callback=None, callback1=None, callback2=None, callback3=None): super().__init__(master) self.id_ = id_ self.callback = callback # add_account() self.callback1 = callback1 # get_accounts() self.callback2 = callback2 # remove_account() self.callback3 = callback3 # add_money() self.pack() # Defining main frames self.fr_buttons = Frame(self) self.fr_buttons.grid(row=0, column=0) self.fr_treeview = Frame(self) self.fr_treeview.grid(row=0, column=1) # Frame Buttons self.btn_add_acc = Button(self.fr_buttons, text="add account", command=self.add_account) self.btn_add_acc.grid(row=0, column=0) self.btn_del_acc = Button(self.fr_buttons, text="delete account", command=self.del_account) self.btn_del_acc.grid(row=1, column=0) self.btn_add_money = Button(self.fr_buttons, text="add money", command=self.add_money) self.btn_add_money.grid(row=2, column=0) # Frame Treev self.treev = ttk.Treeview(self.fr_treeview, selectmode="browse", height=15) self.treev.grid(row=0, column=0) self.treev['columns'] = ("1", "2") self.treev["show"] = "headings" self.treev.column("1", width=140, anchor='c') self.treev.column("2", width=140, anchor='c') self.treev.heading("1", text="account number") self.treev.heading("2", text="remaining") self.scrollbar = ttk.Scrollbar(self.fr_treeview, command=self.treev.yview, orient=tk.VERTICAL) self.scrollbar.grid(row=0, column=1) self.treev.configure(xscrollcommand=self.scrollbar.set) if self.callback1: # filling treeview for data in self.callback1(): self.treev.insert("", "end", values=data) def add_money(self): selected = self.treev.selection() if selected == (): return None acc_num, remaining = self.treev.item(selected, "values") if self.callback3: self.callback3(acc_num) def del_account(self): selected = self.treev.selection() if selected == (): return None acc_num, remaining = self.treev.item(selected, "values") self.treev.delete(selected) if self.callback2: self.callback2(acc_num) def add_account(self): if self.callback: card_num = self.callback(self.id_) self.treev.insert("", "end", values=(card_num, "0"))