从零开始构建员工管理系统:Python与SQLite3的完美结合

简介: 本文介绍如何使用Python和Tkinter构建一个图形界面的员工管理系统(EMS)。系统包括数据库设计、核心功能实现和图形用户界面创建。主要功能有查询、添加、删除员工信息及统计员工数量。通过本文,你将学会如何结合SQLite数据库进行数据管理,并使用Tkinter创建友好的用户界面。

引言

在现代企业中,有效的员工管理是确保组织高效运作的关键。一个简单的员工管理系统可以帮助你轻松地查询、添加、删除和统计员工信息。本文将带你一步步构建一个基于Python和Tkinter的图形界面员工管理系统(EMS, Employment Management System)。我们将涵盖数据库设计、图形用户界面创建以及核心功能的实现。

环境准备

确保你已经安装了Python和相关的库。你可以使用以下命令来安装所需的库:

pip install tkinter sqlite3

数据库设计

我们使用SQLite数据库来存储员工信息。假设每个员工有以下字段:

  • id (主键,自增)
  • name (姓名)
  • gender (性别)
  • age (年龄)
  • department (部门)
  • position (职务)
  • salary (工资)

创建数据库和表

首先,我们需要创建一个SQLite数据库并定义表结构。

import sqlite3

def get_db_connection():
    conn = sqlite3.connect('employees.db')
    return conn

def create_db():
    conn = get_db_connection()
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS employees
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                 name TEXT NOT NULL,
                 gender TEXT NOT NULL,
                 age INTEGER NOT NULL,
                 department TEXT NOT NULL,
                 position TEXT NOT NULL,
                 salary REAL NOT NULL)''')
    conn.commit()
    conn.close()

create_db()

核心功能实现

查询所有员工

def query_employees():
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("SELECT * FROM employees")
    rows = c.fetchall()
    conn.close()
    return rows

根据姓名或ID查询员工

def query_employee_by_name_or_id(name_or_id):
    conn = get_db_connection()
    c = conn.cursor()
    if name_or_id.isdigit():
        c.execute("SELECT * FROM employees WHERE id=?", (int(name_or_id),))
    else:
        c.execute("SELECT * FROM employees WHERE name=?", (name_or_id,))
    rows = c.fetchall()
    conn.close()
    return rows

检查是否存在完全重复的员工

def check_duplicate_employee(name, gender, age, department, position, salary):
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("SELECT * FROM employees WHERE name=? AND gender=? AND age=? AND department=? AND position=? AND salary=?", (name, gender, age, department, position, salary))
    rows = c.fetchall()
    conn.close()
    return len(rows) > 0

添加新员工

def add_employee(name, gender, age, department, position, salary):
    if not all([name, gender, age, department, position, salary]):
        messagebox.showwarning("Input Error", "All fields must be filled.")
        return False
    if check_duplicate_employee(name, gender, age, department, position, salary):
        if not messagebox.askyesno("Duplicate Entry", "This employee already exists. Do you want to add it anyway?"):
            return False
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("INSERT INTO employees (name, gender, age, department, position, salary) VALUES (?, ?, ?, ?, ?, ?)",
              (name, gender, age, department, position, round(float(salary), 2)))
    conn.commit()
    conn.close()
    return True

删除员工

def delete_employee(employee_id):
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("DELETE FROM employees WHERE id=?", (employee_id,))
    conn.commit()
    conn.close()

统计员工数量

def count_employees():
    conn = get_db_connection()
    c = conn.cursor()
    c.execute("SELECT COUNT(*) FROM employees")
    count = c.fetchone()[0]
    conn.close()
    return count

图形用户界面

接下来,我们使用Tkinter创建图形用户界面。

import tkinter as tk
from tkinter import messagebox, simpledialog

class EmployeeManagementSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("员工管理系统-V1.0")

        # 创建标签和输入框
        self.name_label = tk.Label(root, text="姓名:")
        self.name_label.grid(row=0, column=0, padx=5, pady=5)
        self.name_entry = tk.Entry(root)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5)

        self.gender_label = tk.Label(root, text="性别:")
        self.gender_label.grid(row=1, column=0, padx=5, pady=5)
        self.gender_entry = tk.Entry(root)
        self.gender_entry.insert(0, "男")  # 设置默认值为“男”
        self.gender_entry.grid(row=1, column=1, padx=5, pady=5)

        self.age_label = tk.Label(root, text="年龄:")
        self.age_label.grid(row=2, column=0, padx=5, pady=5)
        self.age_entry = tk.Entry(root)
        self.age_entry.grid(row=2, column=1, padx=5, pady=5)

        self.department_label = tk.Label(root, text="部门:")
        self.department_label.grid(row=3, column=0, padx=5, pady=5)
        self.department_entry = tk.Entry(root)
        self.department_entry.grid(row=3, column=1, padx=5, pady=5)

        self.position_label = tk.Label(root, text="职务:")
        self.position_label.grid(row=4, column=0, padx=5, pady=5)
        self.position_entry = tk.Entry(root)
        self.position_entry.grid(row=4, column=1, padx=5, pady=5)

        self.salary_label = tk.Label(root, text="工资:")
        self.salary_label.grid(row=5, column=0, padx=5, pady=5)
        self.salary_entry = tk.Entry(root)
        self.salary_entry.grid(row=5, column=1, padx=5, pady=5)

        # 创建按钮
        self.add_button = tk.Button(root, text="添加员工", command=self.add_employee)
        self.add_button.grid(row=7, column=0, padx=5, pady=5)

        self.query_button = tk.Button(root, text="查询员工(Name/ID)", command=self.query_employee_by_name_or_id)
        self.query_button.grid(row=7, column=1, padx=5, pady=5)

        self.delete_button = tk.Button(root, text="删除员工", command=self.delete_employee)
        self.delete_button.grid(row=7, column=2, padx=5, pady=5)

        self.count_button = tk.Button(root, text="统计员工", command=self.count_employees)
        self.count_button.grid(row=7, column=3, padx=5, pady=5)

        # 创建结果显示区域
        self.result_text = tk.Text(root, height=10, width=90, bg='black', fg='green')
        self.result_text.grid(row=8, column=0, columnspan=4, padx=5, pady=5)

    def add_employee(self):
        name = self.name_entry.get()
        gender = self.gender_entry.get()
        age = self.age_entry.get()
        department = self.department_entry.get()
        position = self.position_entry.get()
        salary = self.salary_entry.get()

        if not all([name, gender, age, department, position, salary]):
            messagebox.showwarning("Input Error", "Data is empty!")
            return

        try:
            age = int(age)
            salary = float(salary)
        except ValueError:
            messagebox.showwarning("Input Error", "Age and Salary must be numeric.")
            return

        if add_employee(name, gender, age, department, position, round(salary, 2)):
            messagebox.showinfo("Success", "Employee added successfully!")
        else:
            # 如果用户取消了添加操作,不显示任何消息框
            pass

    def query_employee_by_name_or_id(self):
        name_or_id = simpledialog.askstring("Input", "Enter the Name or ID to query:")
        if name_or_id:
            employees = query_employee_by_name_or_id(name_or_id)
            self.display_employees(employees)

    def display_employees(self, employees):
        self.result_text.delete(1.0, tk.END)
        if not employees:
            self.result_text.insert(tk.END, "No employees found.\n")
        else:
            for employee in employees:
                self.result_text.insert(tk.END, f"ID: {employee[0]}, Name: {employee[1]}, Gender: {employee[2]}, Age: {employee[3]}, Department: {employee[4]}, Position: {employee[5]}, Salary: {employee[6]:.2f}\n")

    def delete_employee(self):
        employee_id = simpledialog.askinteger("Input", "Enter the ID of the employee to delete:")
        if employee_id is not None:
            delete_employee(employee_id)
            messagebox.showinfo("Success", "Employee deleted successfully!")

    def count_employees(self):
        count = count_employees()
        messagebox.showinfo("Employee Count", f"Total number of employees: {count}")

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

功能说明

  • 查询:点击“查询员工(Name/ID)”按钮,会弹出一个对话框让你输入姓名或ID,然后在文本框中显示查询结果。
  • 添加:在相应的输入框中输入员工信息,点击“添加员工”按钮,会将员工信息添加到数据库中。如果任何输入字段为空或年龄、工资不是数字,则弹出提示对话框。如果存在完全相同的记录,会弹出提示对话框询问用户是否确定要添加。如果用户选择“取消”,则不进行添加操作,并且不会显示成功添加员工的提示框。
  • 删除:点击“删除员工”按钮,会弹出一个对话框让你输入要删除的员工ID。
  • 统计:点击“统计员工”按钮,会弹出一个消息框显示当前员工总数。
  • 退出:通过关闭窗口退出程序。

运行结果

截屏2024-11-09 19.40.20

截屏2024-11-09 19.41.29.png

结语

通过以上步骤,你已经成功构建了一个简单但功能齐全的员工管理系统。这个系统不仅具备基本的数据管理功能,还提供了友好的图形用户界面。希望这篇文章能帮助你理解和掌握如何使用Python和Tkinter创建图形界面应用程序,并结合SQLite数据库进行数据管理。如果你有任何问题或建议,请随时留言交流!


希望这篇技术博文能够为你提供有用的信息,并激发起你对编程及项目开发的兴趣!如果有任何进一步的问题或需要更多的功能,请留言。

阿里云百炼大模型

https://bailian.console.aliyun.com/

通义灵码_智能编码助手面向用户上线个人和企业版产品

https://tongyi.aliyun.com/lingma/pricing?userCode=jl9als0w

云工开物_阿里云高校计划助力高校科研与教育加速。

https://university.aliyun.com/mobile?userCode=jl9als0w

无影云电脑个人版简单易用、安全高效的云上桌面服务

https://www.aliyun.com/product/wuying/gws/personal_edition?userCode=jl9als0w

云服务器ECS省钱攻略五种权益,限时发放,不容错过

https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?userCode=jl9als0w

相关文章
|
3月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
3月前
|
存储 分布式计算 大数据
基于Python大数据的的电商用户行为分析系统
本系统基于Django、Scrapy与Hadoop技术,构建电商用户行为分析平台。通过爬取与处理海量用户数据,实现行为追踪、偏好分析与个性化推荐,助力企业提升营销精准度与用户体验,推动电商智能化发展。
|
3月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的台风灾害分析及预测系统
针对台风灾害预警滞后、精度不足等问题,本研究基于Python与大数据技术,构建多源数据融合的台风预测系统。利用机器学习提升路径与强度预测准确率,结合Django框架实现动态可视化与实时预警,为防灾决策提供科学支持,显著提高应急响应效率,具有重要社会经济价值。
|
3月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
4月前
|
数据采集 数据可视化 关系型数据库
基于python大数据的电影数据可视化分析系统
电影分析与可视化平台顺应电影产业数字化趋势,整合大数据处理、人工智能与Web技术,实现电影数据的采集、分析与可视化展示。平台支持票房、评分、观众行为等多维度分析,助力行业洞察与决策,同时提供互动界面,增强观众对电影文化的理解。技术上依托Python、MySQL、Flask、HTML等构建,融合数据采集与AI分析,提升电影行业的数据应用能力。
基于python的餐厅点餐系统
本课题研究开发餐厅点餐系统,旨在提升餐厅信息处理效率与管理水平。通过计算机技术规范点餐流程,加快信息处理速度,助力管理人员高效运作。系统包含功能结构图与具体实现模块,全面展示系统设计与运行逻辑。

推荐镜像

更多