从零开始构建员工管理系统: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

相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
135 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
2月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
356 55
|
1月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
7天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
51 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
132 66
|
22天前
|
人工智能 开发者 Python
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
137 9
|
1月前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
45 20
|
29天前
|
存储 人工智能 算法
深度解密:员工飞单需要什么证据之Python算法洞察
员工飞单是企业运营中的隐性风险,严重侵蚀公司利润。为应对这一问题,精准搜集证据至关重要。本文探讨如何利用Python编程语言及其数据结构和算法,高效取证。通过创建Transaction类存储交易数据,使用列表管理订单信息,结合排序算法和正则表达式分析交易时间和聊天记录,帮助企业识别潜在的飞单行为。Python的强大功能使得从交易流水和沟通记录中提取关键证据变得更加系统化和高效,为企业维权提供有力支持。
|
1月前
|
Shell 程序员 开发者
轻松搞定在Python中构建虚拟环境
本教程教你如何使用业界公认的最佳实践,创建一个完全工作的Python开发环境。虚拟环境通过隔离依赖项,避免项目间的冲突,并允许你轻松管理包版本。我们将使用Python 3的内置`venv`模块来创建和激活虚拟环境,确保不同项目能独立运行,不会相互干扰。此外,还将介绍如何检查Python版本、激活和停用虚拟环境,以及使用`requirements.txt`文件共享依赖项。 通过本教程,你将学会: - 创建和管理虚拟环境 - 避免依赖性冲突 - 部署Python应用到服务器 适合新手和希望提升开发环境管理能力的开发者。
110 2
|
1月前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习果蔬识别系统实现
本项目基于Python和TensorFlow,使用ResNet卷积神经网络模型,对12种常见果蔬(如土豆、苹果等)的图像数据集进行训练,构建了一个高精度的果蔬识别系统。系统通过Django框架搭建Web端可视化界面,用户可上传图片并自动识别果蔬种类。该项目旨在提高农业生产效率,广泛应用于食品安全、智能农业等领域。CNN凭借其强大的特征提取能力,在图像分类任务中表现出色,为实现高效的自动化果蔬识别提供了技术支持。
基于Python深度学习果蔬识别系统实现

热门文章

最新文章

推荐镜像

更多