How to import all data from CSV File into GUI

Question:

I am new to Python and would like to implement a simple Employee Management System (as shown on the attached photo) that do the following functionality

• A GUI for entering, viewing, and exporting employee data. (Already completed)

• The ability to export data into an Excel or csv file. (Already completed but having an issue-Explained bellow)

• The ability to import all data from an Excel or csv file into the GUI.

Here is an example of the GUI

enter image description here

And Here is the CSV File

    Fullname            Age Gender  Position              Phone Number  Address
    Ali Talib           59  Male    Vice-Chancellor       1752555555    UK-London
    Afaf Neamah         23  Female  Manager               7912394404    UK-Plymouth
    Hussein Neamah      22  Male    Head of Department    7335952523    UK-London
    Estabraq Aldalboos  33  Female  Engineer              7575252324    UK-Plymouth
    Nathan Clarke       45  Male    Deputy Head of School 7916682090    UK-London
    Neamah AL-Naffakh   37  Male    Lecturer              7817792202    UK-Plymouth

I need to develop the code to do the following

I am currently having a problem. After each implementation, the code overwrite on the CSV file. For example, let suppose I have 10 records on the CSV file. Once I close or exit from Python, and run the system again, it would store the most recent record and delete all the old records (overwrite the new input with the old date)

I need a better way to import all data from CSV and place it in list or text box (or any suggestion is highly appreciated.

Here is the code

import csv 
from csv import *
from tkinter import *
from tkinter import filedialog
import tkinter.messagebox


window=Tk()                                               #1-1
window.geometry("800x500+0+0")                                #1-2
window.title("Employee Management System")
window.maxsize(width=800,height=500)
window.minsize(width=800,height=500)
main_lst=[]

# add the column value into the list 

FilePath = '/Users/nhal-naffakh/Desktop/Desktop/Sec-Interview/Data.csv'
# Create file object that open the file located in FilePath and store the file info in the object
File=open(FilePath)
# Create Object that read the csv file
# Convert each row in the CSV file into list of string and store it in Object
Reader=csv.reader(File) 
Data=list(Reader)
del(Data[0])                                             #1-5 Delete title of the first row in the CSV

#print(Data[5][1])

# Create set of Functions 
def view():                                              #1-8
  index=listbox1.curselection()[0]
  NameLabel2.config(text=Data[index][0])
  AgeLabel2.config(text=Data[index][1])
  GenderLabel2.config(text=Data[index][2])
  PositionLabel2.config(text=Data[index][3])
  AddressLabel2.config(text=Data[index][4])
  return None

def OpenFile():
    filepath=filedialog.askopenfilename()
#   print(filepath)
# OR
    file=open(filepath,'r')
    print(file.read()) 
    file.close
    
def Add():
   lst=[Nametxt.get(),Agetxt.get(),Gendertxt.get(),Positiontxt.get(),Numbertxt.get(),Addresstxt.get()]
   main_lst.append(lst)
   messagebox.showinfo("Information","The data has been added successfully")
   
def Save():
   with open("Data.csv","w") as file:
      Writer=writer(file)
      Writer.writerow(["Fullname","Age","Gender","Position","Phone Number","Address"])
      Writer.writerows(main_lst)
      messagebox.showinfo("Information","Saved succesfully")
            
def Clear():
   Nametxt.delete(0,END)
   Agetxt.delete(0,END)
   Gendertxt.delete(0,END)
   Positiontxt.delete(0,END)
   Numbertxt.delete(0,END)
   Addresstxt.delete(0,END)

def Exit():
    wayOut = tkinter.messagebox.askyesno("Employee Management System", "Do you want to exit the system")
    if wayOut > 0:
        window.destroy()
        return
   
# extract entire column into List to show it on GUI later 
List_of_Name=[]
for x in list(range(0,len(Data))):
    #print(Data[x][0])
    List_of_Name.append(Data[x][0])    
    var=StringVar(value=List_of_Name)                   #1-3
    listbox1=Listbox(window,listvariable=var) #1-4 Modified by adding var
    listbox1.grid(row=3,column=0)
    
    buttonView=Button(text="ViewRecord",padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black',bg="dark gray",command=view).grid(row=3,column=1)                     #1-7
     
    # Label Widget
    NameLabel=Label(window,text="FullName").grid(row=5,column=0,sticky="w")        #1-9
    AgeLabel=Label(window,text="Age").grid(row=6,column=0,sticky="w")
    GenderLabel=Label(window,text="Gender").grid(row=7,column=0,sticky="w")
    PositionLabel=Label(window,text="Position").grid(row=8,column=0,sticky="w")
    AddressLabel=Label(window,text="Address").grid(row=9,column=0,sticky="w")
    
    
    NameLabel2=Label(window,text="")        #1-10
    NameLabel2.grid(row=5,column=1,sticky="w")
    AgeLabel2=Label(window,text="")
    AgeLabel2.grid(row=6,column=1,sticky="w")
    GenderLabel2=Label(window,text="")
    GenderLabel2.grid(row=7,column=1,sticky="w")
    PositionLabel2=Label(window,text="")
    PositionLabel2.grid(row=8,column=1,sticky="w")
    AddressLabel2=Label(window,text="")
    AddressLabel2.grid(row=9,column=1,sticky="w")

    # Label Widget & Entry Widget    #1-10
    Namelabel3=Label(window,text="Full Name",font=('arial',12,'bold'),bd=3,fg="white",
                     bg="dark blue",).grid(row=0,column=0,sticky="w")
    Nametxt=Entry(window,font=('ariel',12),bd=4,width=22, justify='left')
    Nametxt.grid(row=0,column=1)
    
    Agelabel3=Label(window,text="Age",font=("ariel",12,'bold'),bd=3,fg='white',
                    bg="dark blue",).grid(row=0,column=2)
    Agetxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Agetxt.grid(row=0,column=3)
    
    GenderLabel3=Label(window,text="Gender",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=1,column=0,sticky="w")
    Gendertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Gendertxt.grid(row=1,column=1)
    
    PositionLabel3=Label(window,text="Position",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=1,column=2,sticky="w")
    Positiontxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Positiontxt.grid(row=1,column=3)
    
    NumberLabel3=Label(window,text="Mob Number",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=2,column=0,sticky="w")
    Numbertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Numbertxt.grid(row=2,column=1)
    
    AddressLabel3=Label(window,text="Address",font=('ariel',12,'bold'),bd=3,fg='white',
                    bg="dark blue").grid(row=2,column=2,sticky="w")
    Addresstxt=Entry(window,font=('ariel',12),bd=4, justify='left')
    Addresstxt.grid(row=2,column=3)

    #  Button
    LoadButton=Button(text="Load File", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black',bg="dark gray", command=OpenFile).grid(row=3,column=2)
    AddButton=Button(text="Add Record", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                     width=8,fg='black',bg="dark gray",command=Add).grid(row=3,column=3)
    SaveButton=Button(text="Save", padx=10, pady=4, bd=4, font=('ariel',12,'bold'), 
                      width=8,fg='black',bg="dark gray",command=Save).grid(row=4,column=1)
    ClearButton=Button(text="Clear", padx=10, pady=4, bd=4, font=('ariel',12,'bold'), 
                       width=8,fg='black',bg="dark gray",command=Clear).grid(row=4,column=2)
    ExitButton=Button(text="Exit", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                      width=8,fg='black', bg="dark gray",command=Exit).grid(row=4,column=3)

window.mainloop()
Asked By: Neamah

||

Answers:

The problem is that you have information stored in the Data variable that you load upon program start, and then you have the main_list which is what get’s populated when you add new entries. When you exit or save your program is only saving what is in the main_list to your csv file and completely ignores the contents of the Data variable, thus removing anything that was in the list prior to starting the program.

This can be easily solved by simply merging the two lists into one single main_list which is populated by what is in the csv file on program start and by adding new records during program execution. You also need to store the new names in the listbox1 upon the addition of new records by simply inserting the text into the listbox itself in the Add function

For example:

I made some inline notes and fixed a couple issues with your indentation.

import csv
from tkinter import *
from tkinter import messagebox

def load_data(path):      # Load data from csv file at program start.
    reader = csv.reader(open(path))
    return list(reader)[1:]

window=Tk()
window.geometry("800x500+0+0")
window.title("Employee Management System")
window.maxsize(width=800,height=500)
window.minsize(width=800,height=500)
FILEPATH = '/Users/nhal-naffakh/Desktop/Desktop/Sec-Interview/Data.csv'

main_lst = load_data(FILEPATH)  # Load csv data into `main_lst`


def view():
  index = listbox1.curselection()[0]
  NameLabel2.config(text=main_lst[index][0])
  AgeLabel2.config(text=main_lst[index][1])
  GenderLabel2.config(text=main_lst[index][2])
  PositionLabel2.config(text=main_lst[index][3])
  AddressLabel2.config(text=main_lst[index][4])

def OpenFile():
    pass

def Add():
   name = Nametxt.get()  # get the name of new entry
   lst = [name, Agetxt.get(), Gendertxt.get(), Positiontxt.get(), Numbertxt.get(), Addresstxt.get()]
   main_lst.append(lst)
   listbox1.insert(len(List_of_Name), name)  # add it to the listbox list
   List_of_Name.append(name)  # store it in the list of names
   messagebox.showinfo("Information","The data has been added successfully")

def Save():
   with open(FILEPATH,"w") as file:
      writer = csv.writer(file, lineterminator='n')
      writer.writerow(["Fullname","Age","Gender","Position","Phone Number","Address"])
      writer.writerows(main_lst)  #  now when it writes to file it will contain all the data.
      messagebox.showinfo("Information","Saved succesfully")

def Clear():
   Nametxt.delete(0,END)
   Agetxt.delete(0,END)
   Gendertxt.delete(0,END)
   Positiontxt.delete(0,END)
   Numbertxt.delete(0,END)
   Addresstxt.delete(0,END)

def Exit():
    wayOut = messagebox.askyesno("Employee Management System", "Do you want to exit the system")
    if wayOut > 0:
        Save()  # Added a call to save upon exiting.
        window.destroy()
        return

List_of_Name=[]
for x in list(range(0,len(main_lst))):
    List_of_Name.append(main_lst[x][0])

var = StringVar(value=List_of_Name)
listbox1 = Listbox(window, listvariable=var)
listbox1.grid(row=3,column=0)

buttonView = Button(text="ViewRecord", padx=10, pady=4, bd=4,
                    font=('ariel',12,'bold'), width=8, fg='black',
                    bg="dark gray", command=view).grid(row=3,column=1)
NameLabel = Label(window,text="FullName").grid(row=5,column=0,sticky="w")
AgeLabel=Label(window,text="Age").grid(row=6,column=0,sticky="w")
GenderLabel=Label(window,text="Gender").grid(row=7,column=0,sticky="w")
PositionLabel=Label(window,text="Position").grid(row=8,column=0,sticky="w")
AddressLabel=Label(window,text="Address").grid(row=9,column=0,sticky="w")
NameLabel2=Label(window,text="")
NameLabel2.grid(row=5,column=1,sticky="w")
AgeLabel2=Label(window,text="")
AgeLabel2.grid(row=6,column=1,sticky="w")
GenderLabel2=Label(window,text="")
GenderLabel2.grid(row=7,column=1,sticky="w")
PositionLabel2=Label(window,text="")
PositionLabel2.grid(row=8,column=1,sticky="w")
AddressLabel2=Label(window,text="")
AddressLabel2.grid(row=9,column=1,sticky="w")
Namelabel3=Label(window,text="Full Name",
                    font=('arial',12,'bold'),bd=3,fg="white",
                    bg="dark blue",).grid(row=0,column=0,sticky="w")
Nametxt = Entry(window,font=('ariel',12),bd=4,width=22, justify='left')
Nametxt.grid(row=0,column=1)

Agelabel3=Label(window,text="Age",font=("ariel",12,'bold'),bd=3,fg='white',
                bg="dark blue",).grid(row=0,column=2)
Agetxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Agetxt.grid(row=0,column=3)

GenderLabel3=Label(window,text="Gender",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=1,column=0,sticky="w")
Gendertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Gendertxt.grid(row=1,column=1)

PositionLabel3=Label(window,text="Position",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=1,column=2,sticky="w")
Positiontxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Positiontxt.grid(row=1,column=3)

NumberLabel3=Label(window,text="Mob Number",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=2,column=0,sticky="w")
Numbertxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Numbertxt.grid(row=2,column=1)

AddressLabel3=Label(window,text="Address",font=('ariel',12,'bold'),bd=3,fg='white',
                bg="dark blue").grid(row=2,column=2,sticky="w")
Addresstxt=Entry(window,font=('ariel',12),bd=4, justify='left')
Addresstxt.grid(row=2,column=3)

#  Button
LoadButton=Button(text="Load File", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray", command=OpenFile).grid(row=3,column=2)
AddButton=Button(text="Add Record", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Add).grid(row=3,column=3)
SaveButton=Button(text="Save", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Save).grid(row=4,column=1)
ClearButton=Button(text="Clear", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black',bg="dark gray",command=Clear).grid(row=4,column=2)
ExitButton=Button(text="Exit", padx=10, pady=4, bd=4, font=('ariel',12,'bold'),
                    width=8,fg='black', bg="dark gray",command=Exit).grid(row=4,column=3)

window.mainloop()
Answered By: Alexander