from tkinter import * from tkinter import ttk import pandas as pd from lib import treerow_add, csvrow_add, treerow_del, csvrow_del, row_tracker from tkinter import messagebox class EmployeeManifest(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.employeereg_columns = ['department','fname','sname','cardID'] #Data frames for list of departments and database of users self.employee_df = pd.read_csv('employeeregister.csv', converters={'cardID': str}) self.department_df = pd.read_csv('departments.csv') self.row_tracker = row_tracker(self.department_df, 0) self.input_frame = Frame(self) self.input_frame.grid(row=0, column=0, sticky='w') self.firstname_label = Label(self.input_frame, text='First Name') self.firstname_label.grid(row=0, column=0, padx=10, sticky="w") self.firstname_text = Entry(self.input_frame) self.firstname_text.grid(row=0, column=1, pady=5) self.firstname_text.focus() self.surname_label = Label(self.input_frame, text='Surname') self.surname_label.grid(row=1, column=0, padx=10, sticky="w") self.surname_text = Entry(self.input_frame) self.surname_text.grid(row=1, column=1, pady=5) self.card_label = Label(self.input_frame, text='Scan Card') self.card_label.grid(row=2, column=0, padx=10, sticky="w") self.card_text = Entry(self.input_frame) self.card_text.grid(row=2, column=1, pady=5) self.enter_btn = Button(self.input_frame, text='Enter Employee Info', command= lambda: self.write_line_csv(self.get_inputs())) self.enter_btn.grid(row=3, column=0, pady=5, padx=10) self.del_row_btn = Button(self.input_frame, text='Delete Employee(s)', command=self.delete_employees) self.del_row_btn.grid(row=3, column=1, padx=10) #create and store options for the department option menu self.department_options = [] for rownum, row in self.department_df.iterrows(): self.department_options.append(row.Department) #Create department option menu self.value_inside = StringVar(self.input_frame) self.value_inside.set("") self.options_label = Label(self.input_frame, text='Department') self.options_label.grid(row=0, column=2, padx=10) self.department_options = OptionMenu(self.input_frame, self.value_inside, *self.department_options) self.department_options.config(width=14) self.department_options.grid(row=0, column=3, padx=(0, 10)) self.employee_register_tree = ttk.Treeview(self) self.employee_register_tree.grid(column=0, row=4, padx=(10, 0), sticky="we") self.employee_register_tree['columns'] = ('First Name', 'Surname', 'Card Code') self.employee_register_tree.column('#0', width=120) self.employee_register_tree.column('First Name', anchor=CENTER, width=110) self.employee_register_tree.column('Surname', anchor=CENTER, width=110) self.employee_register_tree.column('Card Code', anchor=CENTER, width=110) #Define headings for each column self.employee_register_tree.heading('#0', text='Department') self.employee_register_tree.heading('First Name', text='First Name') self.employee_register_tree.heading('Surname', text='Surname') self.employee_register_tree.heading('Card Code', text='Card Code') self.tree_scrollbar = Scrollbar(self, orient="vertical", command=self.employee_register_tree.yview) self.employee_register_tree.configure(yscrollcommand=self.tree_scrollbar.set) self.tree_scrollbar.grid(column=1,row=4, sticky='ns', pady=(0, 10)) for rownum, row in self.employee_df.iterrows(): treerow_add(self.row_tracker, self.employee_register_tree, row) def delete_employees(self): employees = self.employee_register_tree.selection() #Prevent deletion of department parent row for employee in employees: if 'D' in employee: return delete_prompt = messagebox.askokcancel('Delete Users', 'Are you sure you wish to delete user(s)') if delete_prompt == False: return #Delete user from tree and CSV self.employee_df = csvrow_del('employeeregister.csv', self.employee_df, employees) treerow_del(self.row_tracker, self.employee_register_tree, employees) #Clear inputs of all fields def clear_inputs(self, input_arr): self.value_inside.set("") for input in input_arr: input.delete('0', END) self.firstname_text.focus() #Return array of inputs in all fields def get_inputs(self): inputs = [self.value_inside.get(), self.firstname_text.get(), self.surname_text.get(), self.card_text.get()] return inputs def write_line_csv(self, inputs): #Field validation for input in inputs: if input == '': messagebox.showerror('Validation Error', 'Please make sure all fields are completed') return for x in range(len(self.employee_df)): if self.employee_df.iloc[x]['cardID'] == inputs[3]: messagebox.showerror('Validation Error', 'Card ID must be unique for each employee') return self.clear_inputs([self.firstname_text, self.surname_text, self.card_text]) #Add user to tree and csv treerow_add(self.row_tracker, self.employee_register_tree, inputs) self.employee_df = csvrow_add('employeeregister.csv', self.employee_df, self.employeereg_columns, inputs)