Python中基于Tkinter+SQLite3设计员工信息管理系统(第21节)


企业员工信息管理系统可以有效提高管理者对员工的管理效率,优化人力资源管理流程。通过Python的Tkinter+SQLite3库设计员工信息管理系统,以其独特的实用性和易用性,成为Python程序设计的首选实战项目。本节教程将结合Tkinter(GUI)图形界面库和SQLite3数据库技术,设计一个直观、高效的员工信息管理系统,该系统包含用户登录界面以及员工信息的增加、删除、查询和修改等功能。

1、员工信息管理系统介绍

在构建员工信息管理系统时,首先要创建一个安全的登录界面,默认登录账号为“admin”,密码为“123456”,登录成功后就可以进入系统,实现对员工信息的管理。

该系统的数据库存储使用SQLite3, 数据库文件名:employee.db。SQLite3是Python官方标准库中用于操作SQLite数据库的模块,它提供了轻量级、跨平台的数据库,无需额外安装,可以直接通过连接数据库文件(如employee.db),并执行SQL语句即可操作数据。打开该员工信息管理系统后,会在当前工作目录下创建一个名为“employee.db”的数据库文件,并自动在数据库文件中创建名为“employee”的数据库表,用于保存员工信息。首次打开该系统,默认会向employee表中插入两条员工信息,以供参考。

功能说明

查询:点击“查询员工信息”按钮,会弹出一个查询窗口,让你输入工号、姓名、年龄,部门,职务,手机号码或者工资,可以不全填,只要输入任意一项内容即可查询结果。

添加:点击“添加员工信息”按钮,在弹出的窗口中输入员工信息,点击“立即添加”按钮,会将一条员工信息添加到数据库中。如果员工信息输入为空或工号不是6位数字或年龄不是正整数,则弹出提示对话框。如果数据库中存在相同的工号,则会弹出提示对话框,提示工号不能重复。如果用户选择“批量添加”,则支持Excel批量导入添加员工信息。批量导入Excel过程中,如果对Excel格式不了解,可以点击“下载模板”按钮,下载指定格式的Excel表格文件。

删除:点击“删除员工信息”按钮,会弹出删除员工信息的窗口,输入你要删除的员工工号。在删除指定员工信息之前,可以先点击“立即查询”按钮查询员工信息,再点击“立即删除”按钮,防止误删。也可以在显示的员工信息列表中直接右击鼠标,删除指定的员工信息。

修改:点击“修改员工信息”按钮,会弹出修改员工信息的窗口,在修改之前,可以先输入员工工号再点击“立即查询”按钮会显示原有的员工信息,对原有的信息修改后直接按“立即修改”按钮,即可对数据库中的员工信息进行任意修改。也可以在显示的员工信息列表中直接双击鼠标,弹出修改员工信息的窗口。

退出:通过点击“退出管理系统”按钮关闭窗口,退出程序。

导出员工信息:通过点击“导出以上员工信息”按钮,可以将部分或者全部员工信息导出到指定的Excel文件内,方便保存和管理数据。

2、员工信息管理系统界面演示

登录账号:admin,密码:123456

Python中基于Tkinter+SQLite3设计员工信息管理系统

Python中基于Tkinter+SQLite3设计员工信息管理系统

Python中基于Tkinter+SQLite3设计员工信息管理系统

Python中基于Tkinter+SQLite3设计员工信息管理系统

Python中基于Tkinter+SQLite3设计员工信息管理系统

Python中基于Tkinter+SQLite3设计员工信息管理系统

3、代码实现

(1)安装openpyxl库和pandas库

首先,确保你已经安装了openpyxl库和pandas库。如果还没有安装,可以通过pip安装:

pip install openpyxl
pip install pandas

(2)导入必要的库

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from tkinter.ttk import PanedWindow, Treeview
from tkinter.filedialog import askopenfilename, askdirectory
import pandas as pd
import os, sqlite3, webbrowser, openpyxl

(3)连接到数据库

import os, sqlite3

# 定义数据库文件为“employee.db”
employee_file = 'employee.db'

# 连接到数据库(如果数据库不存在,则会自动创建)
try:
    if not os.path.exists(employee_file):
        # 创建数据库连接
        def database_connection():
            result = sqlite3.connect(employee_file)
            return result

        # 插入数据
        def create_db():
            result = database_connection()
            connection = result.cursor()
            # 创建员工信息employee表,用于存储员工信息
            connection.execute('''CREATE TABLE IF NOT EXISTS employee (
                            number TEXT NOT NULL,
                            names TEXT NOT NULL,
                            gender TEXT NOT NULL,
                            age TEXT NOT NULL,
                            department TEXT NOT NULL,
                            position TEXT NOT NULL,
                            mobile TEXT NOT NULL,
                            salary TEXT NOT NULL)''')

            # 定义元组列表
            data = [
                ('123456', '张三', '男', '25', '制造部', '作业员', '123456789', '5000'),
                ('654321', '李四', '女', '26', '技术部', '操作员', '123456789', '7000')
            ]

            # 使用元组列表将默认的员工信息插入employee表中
            connection.executemany('INSERT INTO employee (number, names, gender, age, department, position, mobile, salary) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', data)

            result.commit()  # 提交事务以保存数据库的更改
            result.close()   # 关闭连接
        # 执行插入数据
        create_db()
except:
    pass

这里,我们使用的SQLite3数据库文件名为“employee.db”,先判断当前工作目录下是否存在数据库文件,如果数据库文件不存在,则会自动创建该数据库文件,并在数据库文件中创建一个employee表,程序默认会向employee表中插入两条员工信息分别为 ('123456', '张三', '男', '25', '制造部', '作业员', '123456789', '5000')和('654321', '李四', '女', '26', '技术部', '操作员', '123456789', '7000')。

(4)员工信息管理系统,完整代码如下所示:

动手练一练:

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from tkinter.ttk import PanedWindow, Treeview
from tkinter.filedialog import askopenfilename, askdirectory
import pandas as pd
import os, sqlite3, webbrowser, openpyxl

# 获取当前脚本文件所在的目录
default_directory = os.path.dirname(os.path.abspath(__file__))
# 将当前脚本文件所在的目录设置为工作目录
os.chdir(default_directory)

# 定义登录账号为“admin”,密码为“123456”
user_name = "admin"
password = "123456"

# 定义数据库文件为“employee.db”
employee_file = 'employee.db'

# 连接到数据库(如果数据库不存在,则会自动创建)
try:
    if not os.path.exists(employee_file):
        # 创建数据库连接
        def database_connection():
            result = sqlite3.connect(employee_file)
            return result

        # 插入数据
        def create_db():
            result = database_connection()
            connection = result.cursor()
            # 创建员工信息employee表,用于存储员工信息
            connection.execute('''CREATE TABLE IF NOT EXISTS employee (
                            number TEXT NOT NULL,
                            names TEXT NOT NULL,
                            gender TEXT NOT NULL,
                            age TEXT NOT NULL,
                            department TEXT NOT NULL,
                            position TEXT NOT NULL,
                            mobile TEXT NOT NULL,
                            salary TEXT NOT NULL)''')

            # 定义元组列表
            data = [
                ('123456', '张三', '男', '25', '制造部', '作业员', '123456789', '5000'),
                ('654321', '李四', '女', '26', '技术部', '操作员', '123456789', '7000')
            ]

            # 使用元组列表将默认的员工信息插入employee表中
            connection.executemany('INSERT INTO employee (number, names, gender, age, department, position, mobile, salary) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', data)

            result.commit()  # 提交事务以保存数据库的更改
            result.close()   # 关闭连接
        # 执行插入数据
        create_db()
except:
    pass

# 定于一个方法,用于检查工号是否规范,返回6位数字
def is_ID(ID):
    return len(ID) == 6 and ID.isdigit()

# 定于一个方法,用于检查年龄是否规范,必须为正整数
def is_Age(Age):
    return Age.isdigit() and 0 <= int(Age)

# 定义一个方法,用于添加员工信息到数据库内
def add(number, names, gender, age, department, position, mobile, salary):
    connection = sqlite3.connect(employee_file)
    sql = """insert into employee(number, names, gender, age, department, position, mobile, salary) values (?, ?, ?, ?, ?, ?, ?, ?)"""
    cursor = connection.cursor()
    cursor.execute(sql, (number, names, gender, age, department, position, mobile, salary,))
    result = cursor.fetchall()
    connection.commit()
    connection.close()
    if len(result) == 0:
        return True
    else:
        return False

# 定义member类
class member:
    def __init__(self, number, names, gender, age, department, position, mobile, salary):
        self.number = number
        self.names = names
        self.gender = gender
        self.age = age
        self.department = department
        self.position = position
        self.mobile = mobile
        self.salary = salary

    def get_member(self):
        message_dict = {
            'number': self.number,
            'names': self.names,
            'gender': self.gender,
            'age': self.age,
            'department': self.department,
            'position': self.position,
            'mobile': self.mobile,
            'salary': self.salary,
        }
        return message_dict

def get_data():
    connection = sqlite3.connect(employee_file)
    sql = """select * from employee"""
    cursor = connection.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    connection.commit()
    connection.close()
    member_list = []
    for result in results:
        member_li = member(result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7])
        member_list.append(member_li)
    return member_list

def search(number):
    connection = sqlite3.connect(employee_file)
    sql = """select * from employee where number=?"""
    cursor = connection.cursor()
    cursor.execute(sql,(number,))
    result = cursor.fetchall()
    connection.commit()
    connection.close()
    if len(result) == 0:
        return False
    else:
        message = member(result[0][0], result[0][1], result[0][2], result[0][3], result[0][4], result[0][5], result[0][6], result[0][7])
        return message

def delete(number):
    connection = sqlite3.connect(employee_file)
    sql = """delete from employee where number=?"""
    cursor = connection.cursor()
    cursor.execute(sql, (number,))
    result = cursor.fetchall()
    connection.commit()
    connection.close()
    if len(result) == 0:
        return True
    else:
        return False

def change(number, names, gender, age, department, position, mobile, salary):
    connection = sqlite3.connect(employee_file)
    sql = """update employee set names = ? , gender = ? , age = ? , department = ? , position = ? , mobile = ? , salary = ? where number = ?"""
    cursor = connection.cursor()
    cursor.execute(sql, (names, gender, age, department, position, mobile, salary, number,))
    result = cursor.fetchall()
    connection.commit()
    connection.close()
    if len(result) == 0:
        return True
    else:
        return False

def adds_member(excel_list):
    result = []
    excel_list = excel_list
    for message in excel_list:
        number = message['number'][0]
        names = message['names'][0]
        gender = message['gender'][0]
        age = message['age'][0]
        department = message['department'][0]
        position = message['position'][0]
        mobile = message['mobile'][0]
        salary = message['salary'][0]
        resu = add(number, names, gender, age, department, position, mobile, salary)
        result.append(resu)
    return result

# 定义导入员工数据的excel类
class add_member_excel:
    def __init__(self, path):
        self.filepath = path
        self.excel_list = []
        self.result = None
        self.add_data()

    def add_data(self):
        workbook = openpyxl.load_workbook(self.filepath)
        ws = workbook[workbook.sheetnames[0]]
        excel_max_row = ws.max_row

        for row in range(2, excel_max_row + 1):
            number = ws.cell(row, 1).value,
            names = ws.cell(row, 2).value,
            gender = ws.cell(row, 3).value,
            age = ws.cell(row, 4).value,
            department = ws.cell(row, 5).value,
            position = ws.cell(row, 6).value,
            mobile = ws.cell(row, 7).value,
            salary = ws.cell(row, 8).value,
            message = member(number, names, gender, age, department, position, mobile, salary)
            message_dict = message.get_member()
            self.excel_list.append(message_dict)
        result_list = adds_member(self.excel_list)
        self.result = result_list[0]

# 定义导出员工信息模板的excel类
class member_excel:
    def __init__(self, path):
        self.filepath = path
        self.result = None
        self.data_example()

    # 向excel表格中插入默认数据
    def data_example(self):
        message = member('6位数工号','工号不能重复','','','','','','')
        number = message.get_member()
        excel_list = [number]
        number = []
        names = []
        gender = []
        age = []
        department = []
        position = []
        mobile = []
        salary = []

        for lists in excel_list:
            number.append(lists['number'])
            names.append(lists['names'])
            gender.append(lists['gender'])
            age.append(lists['age'])
            department.append(lists['department'])
            position.append(lists['position'])
            mobile.append(lists['mobile'])
            salary.append(lists['salary'])
        testData = [number, names, gender, age, department, position, mobile, salary]
        name = '/员工信息批量导入模板.xlsx'
        filepath = self.filepath + name
        self.result = self.pd_toexcel(testData, filepath)

    # 利用pandas库保存数据到excel
    def pd_toexcel(self, data, filename): 
        dfData = {
            '工号': data[0],
            '姓名': data[1],
            '性别': data[2],
            '年龄': data[3],
            '部门': data[4],
            '职务': data[5],
            '手机号码': data[6],
            '工资': data[7],
        }
        # 创建DataFrame
        df = pd.DataFrame(dfData)  
        df.to_excel(filename, index=False)
        if len(df) != 0:
            return True
        else:
            return False

# 员工信息管理系统登录页面
class Admin:
    def __init__(self, window):
        self.window = window
        self.window.title("员工信息管理系统登录页面")

        # 设置窗口居中
        window_width = 350
        window_height = 400
        screen_width = self.window.winfo_screenwidth()
        screen_height = self.window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        self.window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        self.window.resizable(width=False, height=False)

        self.frame = tk.Frame(self.window)
        self.frame.pack()
        self.login()

    # 创建登录页面控件
    def login(self):
        # 鼠标点击时绑定函数,清除Entry控件中的提示信息
        def on_entry_click(event):
            if event.widget.get() == '请输入用户名' or event.widget.get() == '请输入密码':
                event.widget.delete(0, tk.END)  # 删除默认文本
                event.widget.config(fg='black')  # 更改文本颜色为黑色

        # 鼠标离开时绑定函数,在Entry控件中显示提示信息
        def on_focus_out(event):
            if event.widget.get() == '':
                if event.widget == self.user_name:
                    event.widget.insert(0, '请输入用户名')
                elif event.widget == self.user_password:
                    event.widget.insert(0, '请输入密码')
                event.widget.config(fg='gray')  # 更改文本颜色为灰色

        # 在上面放置说明文本
        label1 = tk.Label(self.frame, text='欢迎使用', font=('宋体', 20, 'bold'), fg="#3d87b4", justify=tk.CENTER)
        label1.grid(row=0, column=0, padx=10, pady=20)
        label2 = tk.Label(self.frame, text='员工信息管理系统', font=('宋体', 20, 'bold'), fg="#3d87b4", justify=tk.CENTER)
        label2.grid(row=1, column=0, padx=10, pady=20)
        label3 = tk.Label(self.frame, text='版本:V1.0.1', font=('宋体', 20, 'bold'), fg="#3d87b4", justify=tk.CENTER)
        label3.grid(row=2, column=0, padx=10, pady=20)

        # 在下面设计登录窗口
        self.user_name = tk.Entry(self.frame, highlightthickness=1, font=('宋体', 15), bg = "white", width=20)
        self.user_name.grid(row=3, column=0, padx=10, pady=10)
        self.user_name.insert(0, '请输入用户名')  # 插入默认文本
        self.user_name.config(fg='gray')  # 设置文本颜色为灰色
        self.user_name.bind('<FocusIn>', on_entry_click)
        self.user_name.bind('<FocusOut>', on_focus_out)

        self.user_password = tk.Entry(self.frame, highlightthickness=1,font=('宋体', 15), bg = "white", width=20)
        self.user_password.grid(row=4, column=0, padx=10, pady=10)
        self.user_password.insert(0, '请输入密码')  # 插入默认文本
        self.user_password.config(fg='gray')  # 设置文本颜色为灰色
        self.user_password.bind('<FocusIn>', on_entry_click)
        self.user_password.bind('<FocusOut>', on_focus_out)

        button_login = tk.Button(self.frame, text="登录", font=('宋体', 15), bg="#a3cdfd", width=20, command=self.check)
        button_login.grid(row=5, column=0, columnspan=2, padx=10, pady=20)

    # 检查输入的账号和密码是否正确
    def check(self):
        if self.user_name.get() == user_name and self.user_password.get() == password:
            messagebox.showinfo(title="登录成功", message=f"欢迎登录系统,{user_name}!")
            self.frame.destroy()
            Home(self.window)
            return True
        else:
            messagebox.showwarning(title="登录失败", message="账号或密码错误")
            self.user_password.delete(0, tk.END)
            return False

# 员工信息管理系统主页面
class Home:
    def __init__(self, window):
        self.window = window
        self.window.title(f"当前管理员为{user_name}")

        # 设置窗口居中
        window_width = 1000
        window_height = 600
        screen_width = self.window.winfo_screenwidth()
        screen_height = self.window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        self.window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        self.window.resizable(width=False, height=False)
        self.ReadData()
        self.main()
        self.query_result_list = []

    # 读取数据库表中的所有数据
    def ReadData(self):
        self.all_employee_list = []
        member_list = get_data()
        for i in member_list:
            args = (i.get_member()['number'], 
                    i.get_member()['names'], 
                    i.get_member()['gender'], 
                    i.get_member()['age'], 
                    i.get_member()['department'], 
                    i.get_member()['position'], 
                    i.get_member()['mobile'], 
                    i.get_member()['salary'])
            self.all_employee_list.append(args)

    # 清除输入的所有内容
    def del_Entry_content(self):
        self.get_number.delete(0, tk.END)
        self.get_name.delete(0, tk.END)
        self.get_department.delete(0, tk.END)
        self.get_position.delete(0, tk.END)

    # 添加员工信息的主方法
    def Add_Employee_Info(self):
        # 获取输入的信息
        number = self.Txt_ID.get()
        names = self.Txt_Name.get()
        gender = self.Txt_Gender.get()
        age = self.Txt_Age.get()
        department = self.Txt_Department.get()
        position = self.Txt_Position.get()
        mobile = self.Txt_Telephone.get()
        salary = self.Txt_Salary.get()
        # 判断输入的信息不为空
        if number == '' or names == '' or gender == '' or age == '' or department == '' or position == '' or mobile == '' or salary == '':
            messagebox.showwarning(title='提示', message="员工信息不能为空")
            # 检查输入的工号是否规范
        elif not is_ID(number):
            messagebox.showinfo("提示信息","工号格式有误,请重新输入!")
            return
            # 检查输入的年龄是否规范
        elif not is_Age(age):
            messagebox.showinfo("提示信息","年龄格式有误,请重新输入!")
            return
        else:
            # 查询工号是否存在
            conn = sqlite3.connect(employee_file)
            cursor = conn.cursor()
            cursor.execute('select number from employee')
            values = cursor.fetchall()
            userList = []
            for i in values:
                userList.append(i[0])
            if number in userList:
                messagebox.showwarning('提示', '此工号已经存在,请勿重复添加!')
            else:
                try:
                    result = add(number, names, gender, age, department, position, mobile, salary)
                    if result == True:
                        messagebox.showinfo('提示', '添加成功')
                        self.show_all()
                    else:
                        messagebox.showinfo('提示', '添加失败')
                except:
                    pass
            cursor.close()  # 关闭Cursor
            conn.commit()  # 提交事务
            conn.close()   # 关闭数据库连接
        return 'break'

    # 批量添加员工信息方法,导入Excel文件
    def import_member(self):
        f = askopenfilename(title="上传文件", initialdir="D:",filetypes=[("Excel表格",".xlsx")])
        try:
            excel1 = add_member_excel(f)
            if excel1.result == True:
                messagebox.showinfo('提示', '导入成功')
                self.show_all()
            else:
                messagebox.showinfo('提示', '导入失败')
        except:
            pass

    # 导出员工数据到Excel文件
    def export_member1(self):
        file = askdirectory(title="选择保存的文件夹")
        excel1 = member_excel(file)
        if excel1.result == True:
            messagebox.showinfo('提示', '保存成功')
        else:
            messagebox.showinfo('提示', '保存失败')

    # 定义查询员工信息函数
    def search_member(self):
        message =  search(self.Txt_ID.get())
        if message == False:
            self.Txt_ID.set('查询失败')
            self.employee_names_label.config(text='查询失败')
            self.employee_gender_label.config(text='查询失败')
            self.employee_age_label.config(text='查询失败')
            self.employee_department_label.config(text='查询失败')
            self.employee_position_label.config(text='查询失败')
            self.employee_mobile_label.config(text='查询失败')
            self.employee_salary_label.config(text='查询失败')
        else:
            self.employee_names_label.config(text=message.get_member()['names'])
            self.employee_gender_label.config(text=message.get_member()['gender'])
            self.employee_age_label.config(text=message.get_member()['age'])
            self.employee_department_label.config(text=message.get_member()['department'])
            self.employee_position_label.config(text=message.get_member()['position'])
            self.employee_mobile_label.config(text=message.get_member()['mobile'])
            self.employee_salary_label.config(text=message.get_member()['salary'])

    # 定义删除函数
    def delete_member(self):
        result = delete(self.Txt_ID.get())
        if result == True:
            messagebox.showinfo('提示', '删除成功')
            self.show_all()
        else:
            messagebox.showinfo('提示', '删除失败')

    # 定义函数,绑定“立即查询”按钮
    def search_member1(self):
        message =  search(self.Txt_ID.get())
        if message == False:
            self.Txt_ID.set('查询失败')
            self.employee_names.set('查询失败')
            self.employee_age.set('查询失败')
            self.employee_department.set('查询失败')
            self.employee_position.set('查询失败')
            self.employee_mobile.set('查询失败')
            self.employee_salary.set('查询失败')

        else:
            self.employee_names.set(message.get_member()['names'])
            self.employee_gender.set(message.get_member()['gender'])
            self.employee_age.set(message.get_member()['age'])
            self.employee_department.set(message.get_member()['department'])
            self.employee_position.set(message.get_member()['position'])
            self.employee_mobile.set(message.get_member()['mobile'])
            self.employee_salary.set(message.get_member()['salary'])

    # 定义函数,绑定“立即修改”按钮
    def change_member(self):
        result = change(self.Txt_ID.get(), 
                        self.employee_names.get(), 
                        self.employee_gender.get(), 
                        self.employee_age.get(), 
                        self.employee_department.get(), 
                        self.employee_position.get(), 
                        self.employee_mobile.get(), 
                        self.employee_salary.get())
        self.employee_names.set('')
        self.employee_gender.set('')
        self.employee_age.set('')
        self.employee_department.set('')
        self.employee_position.set('')
        self.employee_mobile.set('')
        self.employee_salary.set('')
        if result == True:
            messagebox.showinfo('提示', '修改成功')
            self.show_all()
        else:
            messagebox.showinfo('提示', '修改失败')

    # 修改员工信息,根据符合条件的工号打开“修改员工信息”的窗口
    def Mod_Employee_Info(self):
        # 获取输入的信息
        number = self.Txt_ID.get()
        if not is_ID(number):
            messagebox.showinfo("提示信息","工号格式有误,请重新输入!")
            return
        # 用于指示是否打开窗口的指标
        Flag = True
        for i in self.all_employee_list:
            if number in i[0]:
                self.Modify_Window_Input()
                Flag = False
                break
        if Flag:
            messagebox.showinfo("提示信息","此工号不存在,请重新输入!")
            return

    # 查找员工信息的主方法
    def Search_Employee_Info(self):
        # 重新获取数据库中所有的员工数据
        self.ReadData()
        # 获取输入的信息
        number = self.Txt_ID.get()
        names = self.Txt_Name.get()
        age = self.Txt_Age.get()
        department = self.Txt_Department.get()
        position = self.Txt_Position.get()
        mobile = self.Txt_Telephone.get()
        salary = self.Txt_Salary.get()
        if len(number) != 0 and not is_ID(number):
            messagebox.showinfo("提示信息","工号格式有误,请重新输入!")
            return
        if len(age) != 0 and not is_Age(age):
            messagebox.showinfo("提示信息","年龄格式有误,请重新输入!")
            return
        # 创建临时列表
        List = []
        # 用来指示是否查找到员工的信息指标
        Flag = False
        List.append(number.strip())
        List.append(names.strip())
        List.append(age.strip())
        List.append(department.strip())
        List.append(position.strip())
        List.append(mobile.strip())
        List.append(salary.strip())

        # 遍历,根据输入的部分信息找到符合条件的员工
        for item in self.all_employee_list:
            # and后面加“\”,代表行续符,用于告诉Python解释器,当前行代码未完,下一行也是这个代码的一部分
            if (List[0] in item[0] or len(List[0])==0)and \
                (List[1] in item[1] or len(List[1])==0)and \
                (List[2] in item[3] or len(List[2])==0)and \
                (List[3] in item[4] or len(List[3])==0)and \
                (List[4] in item[5] or len(List[4])==0)and \
                (List[5] in item[6] or len(List[5])==0)and \
                (List[6] in item[7] or len(List[6])==0)and \
                (len(List[0])!=0 or len(List[1])!=0 or len(List[2])!=0 or len(List[3])!=0 or len(List[4])!=0 or len(List[5])!=0 or len(List[6])!=0):
                # 满足条件的员工
                self.query_result_list.append(item)
        # 把结果加载到TreeView中
        self.clear_Tree()
        self.add_treeview(self.query_result_list)
        # “汇总”统计输出
        self.total_text.delete(1.0, tk.END)
        self.total_text.insert(tk.END, len(self.Tree.get_children()))
        self.query_result_list.clear()
        if len(self.Tree.get_children()) != 0:
            Flag = True
        # 判断是否查找成功
        if Flag:
            messagebox.showinfo("提示信息","查询成功")
        else:
            messagebox.showinfo("提示信息","未查询到有关员工信息!")

    # 添加员工信息的窗口
    def Add_Window(self):
        add_window = tk.Toplevel(self.window)
        add_window.title("添加员工信息")

        # 设置窗口居中
        window_width = 500
        window_height = 580
        screen_width = add_window.winfo_screenwidth()
        screen_height = add_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        add_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        add_window.resizable(width=False, height=False)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>添加员工信息<<<")
        Show_result = tk.Label(add_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = 50, y = 30, width = 400, height = 50)

        self.Txt_ID = tk.StringVar()
        self.Txt_ID.set("")
        Label1 = tk.Label(add_window, text = "工号 (6位数字):", font = ('宋体', 12), width = 15)
        Label1.place(x = 75, y = 100, anchor = 'nw')
        Entry_Line1 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_ID, width = 20)
        Entry_Line1.place(x = 200, y = 100, anchor = 'nw')

        self.Txt_Name = tk.StringVar()
        self.Txt_Name.set("")
        Label2 = tk.Label(add_window, text = "姓 名:", font = ('宋体', 12), width = 15)
        Label2.place(x = 75, y = 150, anchor = 'nw')
        Entry_Line2 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Name, width = 20)
        Entry_Line2.place(x = 200, y = 150, anchor = 'nw')

        self.Txt_Gender = tk.StringVar()
        self.Txt_Gender.set("男")
        Label7 = tk.Label(add_window, text = "性 别:", font = ('宋体', 12), width = 15)
        Label7.place(x = 75, y = 200, anchor = 'nw')
        gender_input1 = tk.Radiobutton(add_window, text="男", variable=self.Txt_Gender, value="男")
        gender_input2 = tk.Radiobutton(add_window, text="女", variable=self.Txt_Gender, value="女")
        gender_input1.place(x = 200, y = 200, anchor = 'nw')
        gender_input2.place(x = 260, y = 200, anchor = 'nw')

        self.Txt_Age = tk.StringVar()
        self.Txt_Age.set("")
        Label4 = tk.Label(add_window, text = "年 龄 (数字):", font = ('宋体', 12), width = 15)
        Label4.place(x = 75, y = 250, anchor = 'nw')
        Entry_Line4 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Age, width = 20)
        Entry_Line4.place(x = 200, y = 250, anchor = 'nw')

        self.Txt_Department = tk.StringVar()
        self.Txt_Department.set("")
        Label3 = tk.Label(add_window, text = "部 门:", font = ('宋体', 12), width = 15)
        Label3.place(x = 75, y = 300, anchor = 'nw')
        Entry_Line3 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Department, width = 20)
        Entry_Line3.place(x = 200, y = 300, anchor = 'nw')

        self.Txt_Position = tk.StringVar()
        self.Txt_Position.set("")
        Label5 = tk.Label(add_window, text = "职 务:", font = ('宋体', 12), width = 15)
        Label5.place(x = 75, y = 350, anchor = 'nw')
        Entry_Line5 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Position, width = 20)
        Entry_Line5.place(x = 200, y = 350, anchor = 'nw')

        self.Txt_Telephone = tk.StringVar()
        self.Txt_Telephone.set("")
        Label6 = tk.Label(add_window, text = "手 机 号 码:", font = ('宋体', 12), width = 15)
        Label6.place(x = 75, y = 400, anchor = 'nw')
        Entry_Line6 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Telephone, width = 20)
        Entry_Line6.place(x = 200, y = 400, anchor = 'nw')

        self.Txt_Salary = tk.StringVar()
        self.Txt_Salary.set("")
        Label6 = tk.Label(add_window, text = "工资:", font = ('宋体', 12), width = 15)
        Label6.place(x = 75, y = 450, anchor = 'nw')
        Entry_Line6 = tk.Entry(add_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Salary, width = 20)
        Entry_Line6.place(x = 200, y = 450, anchor = 'nw')

        # 定义"确认"组件,此处绑定函数Add_Employee_Info用于添加员工信息
        Button1_Yes = tk.Button(add_window, text = '立即添加', bg = 'silver', font = ('宋体', 15), command = self.Add_Employee_Info, width = 10)
        Button1_Yes.place(x = 55, y = 500, anchor = 'nw')
        # 定义"批量添加"组件,此处绑定函数import_member用于批量添加员工信息,导入Excel表格内容
        Button1_Yes = tk.Button(add_window, text = '批量添加', bg = 'silver', font = ('宋体', 15), command = self.import_member, width = 10)
        Button1_Yes.place(x = 200, y = 500, anchor = 'nw')
        # 定义"下载模板"组件,此处绑定函数export_member1,用于下载Excel表格的格式
        Button2_No = tk.Button(add_window, text = '下载模板', bg = 'silver', font = ('宋体', 15), command = self.export_member1, width = 10)
        Button2_No.place(x = 340, y = 500, anchor = 'nw')
        # 窗口显示
        add_window.mainloop() 

    # 删除员工信息的窗口
    def Delete_Window(self):
        # 创建window的子窗口
        del_window = tk.Toplevel(self.window)
        del_window.title("删除员工信息")
        self.employee_names = '查询中'
        self.employee_gender = '查询中'
        self.employee_age = '查询中'
        self.employee_department = '查询中'
        self.employee_position = '查询中'
        self.employee_mobile = '查询中'
        self.employee_salary = '查询中'

        # 设置窗口居中
        window_width = 500
        window_height = 580
        screen_width = del_window.winfo_screenwidth()
        screen_height = del_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        del_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        del_window.resizable(width=False, height=False)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>请输入待删除员工的工号<<<")
        Show_result = tk.Label(del_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = 50, y = 30, width = 400, height = 50)

        tk.Label(del_window, text='工号:', font=('宋体', 15), ).place(x=120, y=100)
        tk.Label(del_window, text='姓名:', font=('宋体', 15), ).place(x=120, y=150)
        tk.Label(del_window, text='性别:', font=('宋体', 15), ).place(x=120, y=200)
        tk.Label(del_window, text='年龄:', font=('宋体', 15), ).place(x=120, y=250)
        tk.Label(del_window, text='部门:', font=('宋体', 15), ).place(x=120, y=300)
        tk.Label(del_window, text='职务:', font=('宋体', 15), ).place(x=120, y=350)
        tk.Label(del_window, text='手机号码:', font=('宋体', 15), ).place(x=120, y=400)
        tk.Label(del_window, text='工资:', font=('宋体', 15), ).place(x=120, y=450)
        self.Txt_ID = tk.StringVar()
        tk.Entry(del_window, highlightthickness=1, font=('宋体', 15), bg='#FFFFFF',textvariable=self.Txt_ID).place(x=220, y=100, width=200, height=30)
        self.employee_names_label = tk.Label(del_window, text=self.employee_names, font=('宋体', 15), )
        self.employee_names_label.place(x=220, y=150)
        self.employee_gender_label = tk.Label(del_window, text=self.employee_gender, font=('宋体', 15), )
        self.employee_gender_label.place(x=220, y=200)
        self.employee_age_label = tk.Label(del_window, text=self.employee_age, font=('宋体', 15), )
        self.employee_age_label.place(x=220, y=250)
        self.employee_department_label = tk.Label(del_window, text=self.employee_department, font=('宋体', 15), )
        self.employee_department_label.place(x=220, y=300)
        self.employee_position_label = tk.Label(del_window, text=self.employee_position, font=('宋体', 15), )
        self.employee_position_label.place(x=220, y=350)
        self.employee_mobile_label = tk.Label(del_window, text=self.employee_mobile, font=('宋体', 15), )
        self.employee_mobile_label.place(x=220, y=400)
        self.employee_salary_label = tk.Label(del_window, text=self.employee_salary, font=('宋体', 15), )
        self.employee_salary_label.place(x=220, y=450)

        # 定义"立即查询"组件,此处绑定函数search_member用于删除员工信息之前查询信息
        Button1_Yes = tk.Button(del_window, text = '立即查询', bg = 'silver', font = ('宋体', 15), command=self.search_member, width = 10)
        Button1_Yes.place(x = 75, y = 500, anchor = 'nw')
        # 定义"立即删除"组件,此处绑定函数delete_member()用于删除员工信息
        Button2_No = tk.Button(del_window, text = '立即删除', bg = 'silver', font = ('宋体', 15), command=self.delete_member, width = 10)
        Button2_No.place(x = 325, y = 500, anchor = 'nw')

        # 显示窗口
        del_window.mainloop()

    # 修改员工信息的窗口
    def Modify_Window(self):
        # 创建window的子窗口
        modify_window = tk.Toplevel(self.window)
        modify_window.title("修改员工信息")

        self.Txt_ID = tk.StringVar()
        self.employee_names = tk.StringVar()
        self.employee_gender = tk.StringVar()
        self.employee_age  = tk.StringVar()
        self.employee_department = tk.StringVar()
        self.employee_position = tk.StringVar()
        self.employee_mobile = tk.StringVar()
        self.employee_salary = tk.StringVar()

        # 设置窗口居中
        window_width = 500
        window_height = 580
        screen_width = modify_window.winfo_screenwidth()
        screen_height = modify_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        modify_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        modify_window.resizable(width=False, height=False)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>请输入修改后的信息<<<")
        Show_result = tk.Label(modify_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = 50, y = 30, width = 400, height = 50)
        tk.Label(modify_window, text='工号:', font=("宋体", 15)).place(x=120, y=100)
        tk.Label(modify_window, text='姓名:', font=('宋体', 15)).place(x=120, y=150)
        tk.Label(modify_window, text='性别:', font=('宋体', 15)).place(x=120, y=200)
        tk.Label(modify_window, text='年龄:', font=('宋体', 15)).place(x=120, y=250)
        tk.Label(modify_window, text='部门:', font=('宋体', 15)).place(x=120, y=300)
        tk.Label(modify_window, text='职务:', font=('宋体', 15)).place(x=120, y=350)
        tk.Label(modify_window, text='手机号码:', font=('宋体', 15)).place(x=120, y=400)
        tk.Label(modify_window, text='工资:', font=('宋体', 15)).place(x=120, y=450)

        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.Txt_ID).place(x=220, y=100, width=200, height=30)
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_names).place(x=220, y=150, width=200, height=30)
        tk.Radiobutton(modify_window, text="男", variable=self.employee_gender, value="男").place(x = 220, y = 200, anchor = 'nw')
        tk.Radiobutton(modify_window, text="女", variable=self.employee_gender, value="女").place(x = 280, y = 200, anchor = 'nw')
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_age).place(x=220, y=250, width=200, height=30)
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_department).place(x=220, y=300, width=200, height=30)
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_position).place(x=220, y=350, width=200, height=30)
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_mobile).place(x=220, y=400, width=200, height=30)
        tk.Entry(modify_window, font=('宋体', 15), textvariable=self.employee_salary).place(x=220, y=450, width=200, height=30)

        # 定义"立即查询"组件,此处绑定函数search_member1用于删除员工信息之前查询信息
        Button1_Yes = tk.Button(modify_window, text = '立即查询', bg = 'silver', font = ('宋体', 15), command=self.search_member1, width = 10)
        Button1_Yes.place(x = 75, y = 500, anchor = 'nw')
        # 定义"立即修改"组件,此处绑定函数change_member用于修改员工信息
        Button2_No = tk.Button(modify_window, text = '立即修改', bg = 'silver', font = ('宋体', 15), command=self.change_member, width = 10)
        Button2_No.place(x = 325, y = 500, anchor = 'nw')

        #显示窗口
        modify_window.mainloop()

    # 在员工信息列表,鼠标双击任意一行,弹出“修改员工信息”的窗口
    def Modify_Window_Input(self):
        # 创建window的子窗口
        modify_input_window = tk.Toplevel(self.window)
        modify_input_window.title("修改员工信息")

        # 设置窗口居中
        window_width = 500
        window_height = 580
        screen_width = modify_input_window.winfo_screenwidth()
        screen_height = modify_input_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        modify_input_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        modify_input_window.resizable(width=False, height=False)

        # 获取工号信息
        number = self.Txt_ID.get()
        for i in self.all_employee_list:
            if number in i[0]:
                names = i[1]
                gender = i[2]
                age = i[3]
                department = i[4]
                position = i[5]
                mobile = i[6]
                salary = i[7]

        # 设置默认值为相应的工号,工号不可改变
        def on_key_release(event):
            if event.widget.get():
                event.widget.delete(0, tk.END)
                event.widget.insert(0, number)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>请输入修改后的信息<<<")
        Show_result = tk.Label(modify_input_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = 50, y = 30, width = 400, height = 50)

        self.Txt_ID = tk.StringVar()
        self.Txt_ID.set(number)
        Label1 = tk.Label(modify_input_window, text = "工号 (不可修改):", font = ('宋体', 12), width = 20)
        Label1.place(x = 55, y = 100, anchor = 'nw')
        Entry_Line1 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.Txt_ID, width = 20)
        Entry_Line1.place(x = 210, y = 100, anchor = 'nw')
        # 使用bind绑定到<KeyRelease>事件
        Entry_Line1.bind('<KeyRelease>', on_key_release)

        self.employee_names = tk.StringVar()
        self.employee_names.set(names)
        Label2 = tk.Label(modify_input_window, text = "姓 名:", font = ('宋体', 12), width = 20)
        Label2.place(x = 55, y = 150, anchor = 'nw')
        Entry_Line2 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_names, width = 20)
        Entry_Line2.place(x = 210, y = 150, anchor = 'nw')

        self.employee_gender = tk.StringVar()
        self.employee_gender.set(gender)
        Label7 = tk.Label(modify_input_window, text = "性 别:", font = ('宋体', 12), width = 20)
        Label7.place(x = 55, y = 200, anchor = 'nw')
        gender_input1 = tk.Radiobutton(modify_input_window, text="男", variable=self.employee_gender, value="男")
        gender_input2 = tk.Radiobutton(modify_input_window, text="女", variable=self.employee_gender, value="女")
        gender_input1.place(x = 210, y = 200, anchor = 'nw')
        gender_input2.place(x = 270, y = 200, anchor = 'nw')

        self.employee_age = tk.StringVar()
        self.employee_age.set(age)
        Label4 = tk.Label(modify_input_window, text = "年 龄 (数字):", font = ('宋体', 12), width = 20)
        Label4.place(x = 55, y = 250, anchor = 'nw')
        Entry_Line4 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_age, width = 20)
        Entry_Line4.place(x = 210, y = 250, anchor = 'nw')

        self.employee_department = tk.StringVar()
        self.employee_department.set(department)
        Label3 = tk.Label(modify_input_window, text = "部 门:", font = ('宋体', 12), width = 20)
        Label3.place(x = 55, y = 300, anchor = 'nw')
        Entry_Line3 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_department, width = 20)
        Entry_Line3.place(x = 210, y = 300, anchor = 'nw')

        self.employee_position = tk.StringVar()
        self.employee_position.set(position)
        Label5 = tk.Label(modify_input_window, text = "职 务:", font = ('宋体', 12), width = 20)
        Label5.place(x = 55, y = 350, anchor = 'nw')
        Entry_Line5 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_position, width = 20)
        Entry_Line5.place(x = 210, y = 350, anchor = 'nw')

        self.employee_mobile = tk.StringVar()
        self.employee_mobile.set(mobile)
        Label6 = tk.Label(modify_input_window, text = "手 机 号 码:", font = ('宋体', 12), width = 20)
        Label6.place(x = 55, y = 400, anchor = 'nw')
        Entry_Line6 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_mobile, width = 20)
        Entry_Line6.place(x = 210, y = 400, anchor = 'nw')

        self.employee_salary = tk.StringVar()
        self.employee_salary.set(salary)
        Label6 = tk.Label(modify_input_window, text = "工资:", font = ('宋体', 12), width = 20)
        Label6.place(x = 55, y = 450, anchor = 'nw')
        Entry_Line6 = tk.Entry(modify_input_window, show = None, font = ('宋体', 15), textvariable = self.employee_salary, width = 20)
        Entry_Line6.place(x = 210, y = 450, anchor = 'nw')

        # 定义"确认"组件,此处绑定函数change_member用于修改员工信息
        Button1_Yes = tk.Button(modify_input_window, text = '确认', bg = 'silver', font = ('宋体', 12), command=self.change_member, width = 10)
        Button1_Yes.place(x = 55, y = 500, anchor = 'nw')
        # 定义"取消"组件,此处绑定函数destroy()用于关闭窗口
        Button2_No = tk.Button(modify_input_window, text = '取消', bg = 'silver', font = ('宋体', 12), command = lambda:modify_input_window.destroy(), width = 10)
        Button2_No.place(x = 325, y = 500, anchor = 'nw')

        # 显示窗口
        modify_input_window.mainloop()

    # 查找员工信息的窗口
    def Search_Window(self):
        # 创建window的子窗口
        search_window = tk.Toplevel(self.window)
        search_window.title("查询员工信息")

        # 设置窗口居中
        window_width = 500
        window_height = 500
        screen_width = search_window.winfo_screenwidth()
        screen_height = search_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        search_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        search_window.resizable(width=False, height=False)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>请输入待查找员工的部分信息(可不全填)<<<")
        Show_result = tk.Label(search_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = 35, y = 30, width = 430, height = 50)

        self.Txt_ID = tk.StringVar()
        self.Txt_ID.set("")
        Label1 = tk.Label(search_window, text = "工号 (6位数字):", font = ('宋体', 12), width = 15)
        Label1.place(x = 75, y = 100, anchor = 'nw')
        Entry_Line1 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_ID, width = 20)
        Entry_Line1.place(x = 200, y = 100, anchor = 'nw')

        self.Txt_Name = tk.StringVar()
        self.Txt_Name.set("")
        Label2 = tk.Label(search_window, text = "姓 名:", font = ('宋体', 12), width = 15)
        Label2.place(x = 75, y = 150, anchor = 'nw')
        Entry_Line2 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Name, width = 20)
        Entry_Line2.place(x = 200, y = 150, anchor = 'nw')

        self.Txt_Age = tk.StringVar()
        self.Txt_Age.set("")
        Label4 = tk.Label(search_window, text = "年 龄 (数字):", font = ('宋体', 12), width = 15)
        Label4.place(x = 75, y = 200, anchor = 'nw')
        Entry_Line4 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Age, width = 20)
        Entry_Line4.place(x = 200, y = 200, anchor = 'nw')

        self.Txt_Department = tk.StringVar()
        self.Txt_Department.set("")
        Label3 = tk.Label(search_window, text = "部 门:", font = ('宋体', 12), width = 15)
        Label3.place(x = 75, y = 250, anchor = 'nw')
        Entry_Line3 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Department, width = 20)
        Entry_Line3.place(x = 200, y = 250, anchor = 'nw')

        self.Txt_Position = tk.StringVar()
        self.Txt_Position.set("")
        Label5 = tk.Label(search_window, text = "职 务:", font = ('宋体', 12), width = 15)
        Label5.place(x = 75, y = 300, anchor = 'nw')
        Entry_Line5 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Position, width = 20)
        Entry_Line5.place(x = 200, y = 300, anchor = 'nw')

        self.Txt_Telephone = tk.StringVar()
        self.Txt_Telephone.set("")
        Label6 = tk.Label(search_window, text = "手 机 号 码:", font = ('宋体', 12), width = 15)
        Label6.place(x = 75, y = 350, anchor = 'nw')
        Entry_Line6 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Telephone, width = 20)
        Entry_Line6.place(x = 200, y = 350, anchor = 'nw')

        self.Txt_Salary = tk.StringVar()
        self.Txt_Salary.set("")
        Label7 = tk.Label(search_window, text = "工资:", font = ('宋体', 12), width = 15)
        Label7.place(x = 75, y = 400, anchor = 'nw')
        Entry_Line7 = tk.Entry(search_window, show = None, font = ('宋体', 15), textvariable = self.Txt_Salary, width = 20)
        Entry_Line7.place(x = 200, y = 400, anchor = 'nw')

        # 定义"确认"组件,此处绑定函数Search_Employee_Info用于修改员工信息
        Button1_Yes = tk.Button(search_window, text = '确认', bg = 'silver', font = ('宋体', 12), command = self.Search_Employee_Info, width = 10)
        Button1_Yes.place(x = 75, y = 450, anchor = 'nw')
        # 定义"取消"组件,此处绑定函数destroy()用于关闭窗口
        Button2_No = tk.Button(search_window, text = '取消', bg = 'silver', font = ('宋体', 12), command = lambda:search_window.destroy(), width = 10)
        Button2_No.place(x = 325, y = 450, anchor = 'nw')

        # 显示窗口
        search_window.mainloop()

    # 退出管理系统的窗口
    def Window_Exit(self):
        # 创建app的子窗口
        exit_window = tk.Toplevel()
        exit_window.title("退出管理系统")

        # 设置窗口居中
        window_width = 400
        window_height = 300
        screen_width = exit_window.winfo_screenwidth()
        screen_height = exit_window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        exit_window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        exit_window.resizable(width=False, height=False)

        # 创建标题标签控件
        result = tk.StringVar()
        result.set(">>>您确认离开系统吗?<<<")
        Show_result = tk.Label(exit_window, bg = "white", fg = "black", font = ("宋体", 15), bd = '0', anchor = 'center', textvariable = result)
        Show_result.place(x = "50", y = "75", width = "300", height = "50")

        # 定义"确认"组件,此处绑定函数destroy()用于关闭主窗口
        Button1_Yes = tk.Button(exit_window, text = '确认', bg = 'silver', font = ('宋体', 12), command = lambda:self.window.destroy(), width = 10)
        Button1_Yes.place(x = 50, y = 200, anchor = 'nw')
        # 定义"取消"组件,此处绑定函数destroy()用于关闭窗口
        Button2_No = tk.Button(exit_window, text = '取消', bg = 'silver', font = ('宋体', 12), command = lambda:exit_window.destroy(), width = 10)
        Button2_No.place(x = 250, y = 200, anchor = 'nw')

        # 显示窗口
        exit_window.mainloop()

    # 创建程序介绍页面
    def about_system(self):
        about = tk.Toplevel()
        about.title('关于程序')

        # 设置窗口居中
        window_width = 450
        window_height = 520
        screen_width = about.winfo_screenwidth()
        screen_height = about.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        about.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        about.resizable(width=False, height=False)

        about_frame = tk.Frame(about, width=400, height=520)
        about_frame.pack()
        tk.Label(about_frame, text='员工信息管理系统', font=('宋体', 15)).place(x=120, y=20)
        tk.Label(about_frame, text='使用编程语言:Python', font=('宋体', 13)).place(x=25, y=90)
        tk.Label(about_frame, text='使用数据库:SQLite数据库', font=('宋体', 13)).place(x=25, y=150)
        tk.Label(about_frame, text='数据库文件:employee.db', font=('宋体', 13)).place(x=25, y=210)
        tk.Label(about_frame, text='修改员工信息:在员工信息列表直接双击鼠标', font=('宋体', 13)).place(x=25, y=270)
        tk.Label(about_frame, text='删除员工信息:在员工信息列表右击鼠标', font=('宋体', 13)).place(x=25, y=330)
        tk.Label(about_frame, text='导出员工信息方式:导出到Excel文件内', font=('宋体', 13)).place(x=25, y=390)
        tk.Label(about_frame, text='创作者:www.pyhint.com', font=('宋体', 13)).place(x=25, y=450)
        about.mainloop()

    # 程序讲解页面
    def help_window(self):
        webbrowser.open("https://www.pyhint.com/article/154.html")

    # 显示所有员工信息
    def show_all(self):
        self.ReadData()
        self.clear_Tree()
        # 把所有条件文本框清空
        self.get_number.delete(0, tk.END)
        self.get_name.delete(0, tk.END)
        self.get_department.delete(0, tk.END)
        self.get_position.delete(0, tk.END)
        self.add_treeview(self.all_employee_list)
        # “汇总”统计输出
        self.total_text.delete(1.0, tk.END)
        self.total_text.insert(tk.END, len(self.Tree.get_children()))

    # 遍历列表数据到Treeview控件中
    def add_treeview(self,entries):
        for index in range(len(entries)):
            self.Tree.insert("", index, values=(entries[index][0],
                                                entries[index][1],
                                                entries[index][2],
                                                entries[index][3],
                                                entries[index][4],
                                                entries[index][5],
                                                entries[index][6],
                                                entries[index][7]))

    # 根据输入的内容,查询指定员工信息
    def search_result(self):
        # 重新获取数据库中所有的员工数据
        self.ReadData()
        # 用来指示是否查找到员工的信息指标
        Flag = False
        result_message = []
        result_message.append(self.get_number.get().strip())
        result_message.append(self.get_name.get().strip())
        result_message.append(self.get_department.get().strip())
        result_message.append(self.get_position.get().strip())

        # 遍历,根据输入的部分信息找到符合条件的员工
        for item in self.all_employee_list:
            # and后面加“\”,代表行续符,用于告诉Python解释器,当前行代码未完,下一行也是这个代码的一部分
            if (result_message[0] in item[0] or len(result_message[0])==0)and \
                (result_message[1] in item[1] or len(result_message[1])==0)and \
                (result_message[2] in item[4] or len(result_message[2])==0)and \
                (result_message[3] in item[5] or len(result_message[3])==0)and \
                (len(result_message[0])!=0 or len(result_message[1])!=0 or len(result_message[2])!=0 or len(result_message[3])!=0):
                # 满足条件的员工
                self.query_result_list.append(item)

        # 把结果加载到TreeView中
        self.clear_Tree()
        self.add_treeview(self.query_result_list)
        # “汇总”统计输出
        self.total_text.delete(1.0, tk.END)
        self.total_text.insert(tk.END, len(self.Tree.get_children()))
        self.query_result_list.clear()
        if len(self.Tree.get_children()) != 0:
            Flag = True
        # 判断是否查找成功
        if Flag:
            messagebox.showinfo("提示信息","查询成功")
        else:
            messagebox.showinfo("提示信息","未查询到有关员工信息!")

    # 定义函数,清空Treeview控件中的全部内容
    def clear_Tree(self):
        for i in self.Tree.get_children():
            self.Tree.delete(i)
        # “汇总”统计输出
        self.total_text.delete(1.0, tk.END)
        self.total_text.insert(tk.END, 0)

    # 导出员工信息到指定Excel表格
    def export_winners(self):
        export_result = self.get_all_rows()
        if not any(len(employee_list[0]) > 0 for employee_list in export_result):
            messagebox.showwarning("警告", "没有数据可导出")
            return
        try:
            # 自定义列名
            columns = ['工号', '姓名', '性别', '年龄', '部门', '职务', '手机号码', '工资']
            # 将数据转换为DataFrame
            df = pd.DataFrame(export_result, columns=columns)
            save_path = filedialog.asksaveasfilename(
                defaultextension=".xlsx",
                filetypes=[("Excel文件", "*.xlsx")])
            if save_path:
                df.to_excel(save_path, index=False)
                messagebox.showinfo("成功", "导出成功!")
        except PermissionError:
            messagebox.showerror("错误", "文件被占用,请关闭文件后重试")
        except Exception as e:
            messagebox.showerror("错误", f"导出失败:{str(e)}")

    # 获取当前项的所有列值组成的元组
    def get_all_rows(self):
            rows = []
            for item in self.Tree.get_children():
                row = self.Tree.item(item, 'values')
                rows.append(row)
            return rows

    # 定义员工信息管理系统主页面控件
    def main(self):
        # 上边是标题部分
        self.Pane_top = PanedWindow(width=980, height=85, style="TPanedwindow")
        self.Pane_top.place(x=10, y=5)
        tk.Label(self.Pane_top, text="员工信息管理系统", bg='#f0f0f0', font=("宋体", 40), width=30).place(x=60, y=10)
        # 在主界面创建“汇总”信息,显示员工信息的数量
        total_label = tk.Label(self.Pane_top, text='汇总:', font=10)
        total_label.place(x=790, y=58, width=50, height=25)
        self.total_text = tk.Text(self.Pane_top, relief=tk.FLAT, bg='#f0f0f0', font=10)
        self.total_text.place(x=840, y=60, width=50, height=25)

        # 左边是按钮区域,创建一个容器
        self.Pane_left = PanedWindow(width=195, height=500, style="TPanedwindow")
        self.Pane_left.place(x=5, y=95)
        self.Pane_right = PanedWindow(width=780, height=500, style="TPanedwindow")
        self.Pane_right.place(x=210, y=95)
        # 添加左边按钮
        tk.Button(self.Pane_left, text="添加员工信息", bg = 'silver', font = ('宋体', 15), command = self.Add_Window, width = 15).place(x=20, y=10)
        tk.Button(self.Pane_left, text="删除员工信息", bg = 'silver', font = ('宋体', 15), command = self.Delete_Window, width = 15).place(x=20, y=70)
        tk.Button(self.Pane_left, text="修改员工信息", bg = 'silver', font = ('宋体', 15), command = self.Modify_Window, width = 15).place(x=20, y=130)
        tk.Button(self.Pane_left, text="查询员工信息", bg = 'silver', font = ('宋体', 15), command = self.Search_Window, width = 15).place(x=20, y=190)
        tk.Button(self.Pane_left, text="显示所有信息", bg = 'silver', font = ('宋体', 15), command = self.show_all, width = 15).place(x=20, y=250)
        tk.Button(self.Pane_left, text="关于程序信息", bg = 'silver', font = ('宋体', 15), command = self.about_system, width = 15).place(x=20, y=310)
        tk.Button(self.Pane_left, text="程序讲解页面", bg = 'silver', font = ('宋体', 15), command = self.help_window, width = 15).place(x=20, y=370)
        tk.Button(self.Pane_left, text="退出管理系统", bg = 'silver', font = ('宋体', 15), command = self.Window_Exit, width = 15).place(x=20, y=430)
        # 添加简易的员工信息查询框架
        self.LabelFrame_query = tk.LabelFrame(self.Pane_right, text="员工信息查询", width=770, height=50)
        self.LabelFrame_query.place(x=5, y=5)

        # 添加控件
        self.Label_number = tk.Label(self.LabelFrame_query, text="工号:")
        self.Label_number.place(x=5, y=5)
        self.get_number = tk.Entry(self.LabelFrame_query, width=12)
        self.get_number.place(x=40, y=5)

        self.Label_name = tk.Label(self.LabelFrame_query, text="姓名:")
        self.Label_name.place(x=125, y=5)
        self.get_name = tk.Entry(self.LabelFrame_query, width=12)
        self.get_name.place(x=160, y=5)

        self.Label_department = tk.Label(self.LabelFrame_query, text="部门:")
        self.Label_department.place(x=245, y=5)
        self.get_department = tk.Entry(self.LabelFrame_query, width=14)
        self.get_department.place(x=280, y=5)

        self.Label_position = tk.Label(self.LabelFrame_query, text="职务:")
        self.Label_position.place(x=380, y=5)
        self.get_position = tk.Entry(self.LabelFrame_query, width=14)
        self.get_position.place(x=415, y=5)

        self.search_Button = tk.Button(self.LabelFrame_query, text="查询", width=4,command=self.search_result)
        self.search_Button.place(x=520, y=-4)
        self.clear_Button = tk.Button(self.LabelFrame_query, text="清除", width=4, command=self.del_Entry_content)
        self.clear_Button.place(x=560, y=-4)
        self.clear_all = tk.Button(self.LabelFrame_query, text="清空全部", width=8, command=self.clear_Tree)
        self.clear_all.place(x=625, y=-4)
        self.show_all_Button = tk.Button(self.LabelFrame_query, text="显示全部", width=8,command=self.show_all)
        self.show_all_Button.place(x=695, y=-4)
        # 添加TreeView控件
        self.Tree = Treeview(self.Pane_right, columns=("number", "names", "gender", "age",
                                                       "department", "position", "mobile", "salary"),
                             show="headings", height=16)

        # 设置每一个列的宽度和对齐的方式
        self.Tree.column("number", width=90, anchor="center")
        self.Tree.column("names", width=90, anchor="center")
        self.Tree.column("gender", width=60, anchor="center")
        self.Tree.column("age", width=60, anchor="center")
        self.Tree.column("department", width=120, anchor="center")
        self.Tree.column("position", width=120, anchor="center")
        self.Tree.column("mobile", width=120, anchor="center")
        self.Tree.column("salary", width=86, anchor="center")

        # 设置每个列的标题
        self.Tree.heading("number", text="工号")
        self.Tree.heading("names", text="姓名")
        self.Tree.heading("gender", text="性别")
        self.Tree.heading("age", text="年龄")
        self.Tree.heading("department", text="部门")
        self.Tree.heading("position", text="职务")
        self.Tree.heading("mobile", text="手机号码")
        self.Tree.heading("salary", text="工资")
        self.Tree.place(x=5, y=60)

        # 创建滚动条
        scrollbar = ttk.Scrollbar(self.Pane_right, orient="vertical", command=self.Tree.yview)
        scrollbar.place(x=760, y=60, relheight=0.8)

        # 将滚动条控件与Treeview控件关联
        self.Tree.config(yscrollcommand=scrollbar.set)

        # 鼠标双击员工信息列表任意一行,可以触发修改员工信息页面
        def on_double_click(event):
            # 获取被双击的项的IID
            iid = self.Tree.focus()
            if iid == '':
                return  # 如果没有选中任何一行,则直接返回

            # 获取该行的所有值,结果为元组,再将元组转换成列表,最后获取列表的第一个值
            values = self.Tree.item(iid, "values")
            values_list = list(values)
            result_list = values_list[0]
            num = int(result_list)
            self.Txt_ID = tk.StringVar()
            self.Txt_ID.set(num)
            Entry_Line1 = tk.Entry(self.window, show = None, font = ('宋体', 15), textvariable = self.Txt_ID, width = 20)
            Entry_Line1.place()
            self.Mod_Employee_Info()

        # 绑定鼠标双击事件
        self.Tree.bind("<Double-1>", on_double_click)

        # 鼠标右键点击员工信息列表任意一行,就会显示“删除该行”按钮
        def on_right_click(event):
            # 获取当前焦点项的iid
            iid = self.Tree.focus()
            if iid:
                # 弹出菜单选项
                menu = tk.Menu(self.Tree, tearoff=0)
                menu.add_command(label="删除该行", command=lambda: delete_row(iid))
                menu.tk_popup(event.x_root, event.y_root)

        # 删除函数
        def delete_row(row_id):
            if messagebox.askyesno("删除", "您确定要删除该员工信息吗?"):
                # 获取该行的所有值,结果为元组,再将元组转换成列表,最后获取列表的第一个值
                values = self.Tree.item(row_id, "values")
                values_list = list(values)
                result_list = values_list[0]
                num = int(result_list)
                # 数据库中删除该行
                delete(num)
                # TreeView控件中删除该行
                self.Tree.delete(row_id)

        # 绑定鼠标右键点击事件
        self.Tree.bind("<Button-3>", on_right_click)

        # 添加导出员工信息按钮
        tk.Button(self.Pane_right, text="导出以上员工信息", bg = 'silver', font = ('宋体', 15), command = self.export_winners, width = 17).place(x=300, y=430)

# 当前模块直接被执行
if __name__ == '__main__':
    # 创建主窗口
    root = tk.Tk()
    Admin(root)
    # 开启主循环,让窗口处于显示状态
    root.mainloop()