Create an Employee Management System Project in Python

Faraz

By Faraz -

Learn how to create an Employee Management System in Python with our step-by-step guide. Get the source code and simplify employee management for your business.


create-an-employee-management-system-project-in-python.webp

Table of Contents

  1. Setting Up the Environment
  2. Step-by-Step Implementation of Employee Management System
  3. Full Employee Management System Project Source Code
  4. Conclusion

Managing employees efficiently is crucial for any organization. An Employee Management System (EMS) helps streamline this process by organizing employee data, tracking their performance, and managing their roles. In this article, we'll walk you through creating a simple yet effective EMS using Python's Tkinter library, perfect for building graphical user interfaces (GUIs).

Setting Up the Environment

Installing Python

Before we start, ensure you have Python installed on your computer. You can download the latest version of Python from python.org. Follow the installation instructions specific to your operating system.

Installing Tkinter

Tkinter is included with standard Python distributions, but you can ensure it's installed by running:

pip install tk

Setting up the Project Structure

Create a new directory for your project and open your favorite code editor. This organization helps manage your project files efficiently.

Step-by-Step Implementation of Employee Management System

Understanding the Basic Components

Overview of the Tkinter Library

Tkinter is Python's standard GUI library. It allows you to create windows, dialogs, and various widgets like buttons, labels, and text fields.

Creating the Main Window

The main window is the entry point of our application. We'll define it using the following code:

import tkinter as tk

root = tk.Tk()
root.title("Employee Management System")
root.geometry("1250x600")
root.config(bg="#f4f4f9")
root.mainloop()

This code sets up the main window with a title, size, and background color.

Designing the User Interface

Creating a Title

We'll add a title to our window to give it a professional look:

title = tk.Label(root, text="Employee Management System", font=("Helvetica", 24), bg="#344955", fg="#f9aa33")
title.pack(pady=20)

Adding Input Fields for Employee Data

We'll create input fields for capturing employee details such as Name, Age, Department, Salary, Email, and Position:

form_frame = tk.Frame(root, bg="#f4f4f9")
form_frame.pack(pady=20)

# Adding labels and entry fields
tk.Label(form_frame, text="Name:", bg="#f4f4f9").grid(row=0, column=0, padx=10, pady=5, sticky="w")
tk.Entry(form_frame, textvariable=name_var, width=25).grid(row=0, column=1, padx=10, pady=5)
# Repeat for other fields...

Designing Buttons for CRUD Operations

We'll add buttons to handle adding, updating, and deleting employees:

tk.Button(form_frame, text="Add Employee", command=add_employee, bg="#344955", fg="#ffffff").grid(row=6, column=0, padx=10, pady=10)
tk.Button(form_frame, text="Update Employee", command=update_employee, bg="#344955", fg="#ffffff").grid(row=6, column=1, padx=10, pady=10)
tk.Button(form_frame, text="Delete Employee", command=delete_employee, bg="#344955", fg="#ffffff").grid(row=6, column=2, padx=10, pady=10)

Adding Employee Data

Function to Add an Employee

We'll define a function to add an employee to our list:

def add_employee():
    name = name_var.get()
    age = age_var.get()
    dept = dept_var.get()
    salary = salary_var.get()
    email = email_var.get()
    position = position_var.get()

    if name and age and dept and validate_salary(salary) and email and position:
        emp_id = str(uuid.uuid4())
        employees.append({
            "ID": emp_id,
            "Name": name,
            "Age": age,
            "Department": dept,
            "Salary": float(salary),
            "Email": email,
            "Position": position
        })
        update_treeview()
        clear_form()
    else:
        messagebox.showwarning("Input Error", "All fields are required and must be valid")

This function collects data from input fields, validates it, and adds it to the list of employees.

Updating Employee Data

Function to Update an Employee

We'll create a function to update an existing employee's details:

def update_employee():
    selected_item = tree.selection()
    if selected_item:
        selected_item = selected_item[0]
        values = tree.item(selected_item, "values")
        name = name_var.get()
        age = age_var.get()
        dept = dept_var.get()
        salary = salary_var.get()
        email = email_var.get()
        position = position_var.get()

        if name and age and dept and validate_salary(salary) and email and position:
            for employee in employees:
                if employee["ID"] == values[0]:
                    employee["Name"] = name
                    employee["Age"] = age
                    employee["Department"] = dept
                    employee["Salary"] = float(salary)
                    employee["Email"] = email
                    employee["Position"] = position
            update_treeview()
            clear_form()
        else:
            messagebox.showwarning("Input Error", "All fields are required and must be valid")
    else:
        messagebox.showwarning("Selection Error", "No employee selected")

This function updates the selected employee's details in the list.

Deleting Employee Data

Function to Delete an Employee

We'll add a function to delete an employee:

def delete_employee():
    selected_item = tree.selection()
    if selected_item:
        selected_item = selected_item[0]
        values = tree.item(selected_item, "values")
        employees = [emp for emp in employees if emp["ID"] != values[0]]
        update_treeview()
        clear_form()
    else:
        messagebox.showwarning("Selection Error", "No employee selected")

This function removes the selected employee from the list.

Displaying Employee Data

Setting Up a Treeview to Display Employees

We'll use a Treeview widget to display the list of employees:

tree = ttk.Treeview(root, columns=("ID", "Name", "Age", "Department", "Salary", "Email", "Position"), show="headings")
tree.heading("ID", text="ID")
tree.heading("Name", text="Name")
tree.heading("Age", text="Age")
tree.heading("Department", text="Department")
tree.heading("Salary", text="Salary")
tree.heading("Email", text="Email")
tree.heading("Position", text="Position")
tree.column("ID", width=0, stretch=tk.NO)  # Hide the ID column
tree.pack(pady=20)

tree.bind("<ButtonRelease-1>", select_employee)

This code creates a table to display the employee data.

Populating the Treeview with Employee Data

We'll write a function to update the Treeview with the current list of employees:

def update_treeview():
    for i in tree.get_children():
        tree.delete(i)
    for emp in employees:
        tree.insert("", "end", values=(emp["ID"], emp["Name"], emp["Age"], emp["Department"], emp["Salary"], emp["Email"], emp["Position"]))

This function refreshes the Treeview with updated data.

Selecting Employees from the List

Binding Selection Events

We'll bind the selection event to populate the input fields when an employee is selected:

def select_employee(event):
    selected_item = tree.selection()
    if selected_item:
        selected_item = selected_item[0]
        values = tree.item(selected_item, "values")
        name_var.set(values[1])
        age_var.set(values[2])
        dept_var.set(values[3])
        salary_var.set(values[4])
        email_var.set(values[5])
        position_var.set(values[6])

Clearing the Form

Function to Clear Input Fields

We'll add a function to clear the input fields:

def clear_form():
    name_var.set("")
    age_var.set(0)
    dept_var.set("")
    salary_var.set("")
    email_var.set("")
    position_var.set("")

This function resets all input fields to their default state.

Validating Employee Data

Ensuring Valid Data Entry

We'll ensure that all data entered is valid:

def validate_salary(salary):
    try:
        float(salary)
        return True
    except ValueError:
        return False

This function checks if the salary input is a valid number.

Testing the Application

Running the Application

To test the application, simply run the script:

if __name__ == "__main__":
    root = tk.Tk()
    root.resizable(0,0)
    app = EmployeeManagementSystem(root)
    root.mainloop()

Debugging Common Issues

Check for common issues like incorrect data entry, UI layout problems, and missing dependencies.

Full Employee Management System Project Source Code

import tkinter as tk
from tkinter import ttk, messagebox
import uuid

class EmployeeManagementSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("Employee Management System")
        self.root.geometry("1250x600")
        self.root.config(bg="#f4f4f9")

        # Employee Data
        self.employees = []

        # GUI Setup
        self.setup_ui()

    def setup_ui(self):
        # Title
        title = tk.Label(self.root, text="Employee Management System", font=("Helvetica", 24), bg="#344955",
                         fg="#f9aa33")
        title.pack(pady=20)

        # Frame for Form
        form_frame = tk.Frame(self.root, bg="#f4f4f9")
        form_frame.pack(pady=20)

        # Labels and Entries for Employee Data
        self.name_var = tk.StringVar()
        self.age_var = tk.IntVar()
        self.dept_var = tk.StringVar()
        self.salary_var = tk.StringVar()  # Changed to StringVar for validation
        self.email_var = tk.StringVar()
        self.position_var = tk.StringVar()

        tk.Label(form_frame, text="Name:", bg="#f4f4f9").grid(row=0, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.name_var, width=25).grid(row=0, column=1, padx=10, pady=5)

        tk.Label(form_frame, text="Age:", bg="#f4f4f9").grid(row=1, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.age_var, width=25).grid(row=1, column=1, padx=10, pady=5)

        tk.Label(form_frame, text="Department:", bg="#f4f4f9").grid(row=2, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.dept_var, width=25).grid(row=2, column=1, padx=10, pady=5)

        tk.Label(form_frame, text="Salary:", bg="#f4f4f9").grid(row=3, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.salary_var, width=25).grid(row=3, column=1, padx=10, pady=5)

        tk.Label(form_frame, text="Email:", bg="#f4f4f9").grid(row=4, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.email_var, width=25).grid(row=4, column=1, padx=10, pady=5)

        tk.Label(form_frame, text="Position:", bg="#f4f4f9").grid(row=5, column=0, padx=10, pady=5, sticky="w")
        tk.Entry(form_frame, textvariable=self.position_var, width=25).grid(row=5, column=1, padx=10, pady=5)

        # Buttons for CRUD Operations
        tk.Button(form_frame, text="Add Employee", command=self.add_employee, bg="#344955", fg="#ffffff").grid(row=6,
                                                                                                               column=0,
                                                                                                               padx=10,
                                                                                                               pady=10)
        tk.Button(form_frame, text="Update Employee", command=self.update_employee, bg="#344955", fg="#ffffff").grid(
            row=6, column=1, padx=10, pady=10)
        tk.Button(form_frame, text="Delete Employee", command=self.delete_employee, bg="#344955", fg="#ffffff").grid(
            row=6, column=2, padx=10, pady=10)

        # Treeview for Displaying Employees
        self.tree = ttk.Treeview(self.root, columns=("ID", "Name", "Age", "Department", "Salary", "Email", "Position"),
                                 show="headings")
        self.tree.heading("ID", text="ID")
        self.tree.heading("Name", text="Name")
        self.tree.heading("Age", text="Age")
        self.tree.heading("Department", text="Department")
        self.tree.heading("Salary", text="Salary")
        self.tree.heading("Email", text="Email")
        self.tree.heading("Position", text="Position")
        self.tree.column("ID", width=0, stretch=tk.NO)  # Hide the ID column
        self.tree.pack(pady=20)

        self.tree.bind("", self.select_employee)

    def add_employee(self):
        name = self.name_var.get()
        age = self.age_var.get()
        dept = self.dept_var.get()
        salary = self.salary_var.get()
        email = self.email_var.get()
        position = self.position_var.get()

        if name and age and dept and self.validate_salary(salary) and email and position:
            emp_id = str(uuid.uuid4())
            self.employees.append({
                "ID": emp_id,
                "Name": name,
                "Age": age,
                "Department": dept,
                "Salary": float(salary),
                "Email": email,
                "Position": position
            })
            self.update_treeview()
            self.clear_form()
        else:
            messagebox.showwarning("Input Error", "All fields are required and must be valid")

    def update_employee(self):
        selected_item = self.tree.selection()
        if selected_item:
            selected_item = selected_item[0]
            values = self.tree.item(selected_item, "values")
            name = self.name_var.get()
            age = self.age_var.get()
            dept = self.dept_var.get()
            salary = self.salary_var.get()
            email = self.email_var.get()
            position = self.position_var.get()

            if name and age and dept and self.validate_salary(salary) and email and position:
                for employee in self.employees:
                    if employee["ID"] == values[0]:
                        employee["Name"] = name
                        employee["Age"] = age
                        employee["Department"] = dept
                        employee["Salary"] = float(salary)
                        employee["Email"] = email
                        employee["Position"] = position
                self.update_treeview()
                self.clear_form()
            else:
                messagebox.showwarning("Input Error", "All fields are required and must be valid")
        else:
            messagebox.showwarning("Selection Error", "No employee selected")

    def delete_employee(self):
        selected_item = self.tree.selection()
        if selected_item:
            selected_item = selected_item[0]
            values = self.tree.item(selected_item, "values")
            self.employees = [emp for emp in self.employees if emp["ID"] != values[0]]
            self.update_treeview()
            self.clear_form()
        else:
            messagebox.showwarning("Selection Error", "No employee selected")

    def select_employee(self, event):
        selected_item = self.tree.selection()
        if selected_item:
            selected_item = selected_item[0]
            values = self.tree.item(selected_item, "values")
            self.name_var.set(values[1])
            self.age_var.set(values[2])
            self.dept_var.set(values[3])
            self.salary_var.set(values[4])
            self.email_var.set(values[5])
            self.position_var.set(values[6])

    def update_treeview(self):
        for i in self.tree.get_children():
            self.tree.delete(i)
        for emp in self.employees:
            self.tree.insert("", "end", values=(
            emp["ID"], emp["Name"], emp["Age"], emp["Department"], emp["Salary"], emp["Email"], emp["Position"]))

    def clear_form(self):
        self.name_var.set("")
        self.age_var.set(0)
        self.dept_var.set("")
        self.salary_var.set("")
        self.email_var.set("")
        self.position_var.set("")

    def validate_salary(self, salary):
        try:
            float(salary)
            return True
        except ValueError:
            return False


if __name__ == "__main__":
    root = tk.Tk()
    root.resizable(0,0)
    app = EmployeeManagementSystem(root)
    root.mainloop()

Conclusion

In this article, we've built a basic Employee Management System using Tkinter. This application allows you to add, update, and delete employee records, and display them in a user-friendly interface. With some enhancements, it can be expanded into a more comprehensive system.

That’s a wrap!

I hope you enjoyed this article

Did you like it? Let me know in the comments below 🔥 and you can support me by buying me a coffee.

And don’t forget to sign up to our email newsletter so you can get useful content like this sent right to your inbox!

Thanks!
Faraz 😊

End of the article

Subscribe to my Newsletter

Get the latest posts delivered right to your inbox


Latest Post

Please allow ads on our site🥺