功能描述:
- 职员信息录入
- 职员信息删除
- 根据员工任意信息查询职员
- 所有员工信息展示
开发环境:
- windows, pycharm, tkinter
主程序代码实现
import worker_data
import tkinter
from tkinter import ttk # 导入内部包
# 为什么要捕获异常:初始状态职员管理系统数据文件内容为空,
# 并没有定义work_list,导入一个不存在的变量会导致系统报错
try:
work_list = worker_data.work_list
except Exception:
work_list = list()
order_str = ""
order = 2
name, identity, worker_id, index_info = "", "", "", ""
# 姓名合法检测
def name_check(name):
# 检测传入职员的姓名字符串是否为空
if not name:
return "输入姓名无效,请重新输入!"
return ""
# 身份证合法检测
def identity_check(id_num):
# 定义一个列表存储所有职员身份证号码,便于后续对输入的身份证号码重复性检测
identity_list = list()
# 遍历每个员工的信息
for temp_dict in work_list:
# 从员工字典信息中获取身份证号添加到列表identity_list
identity_list.append(temp_dict["identity"])
# 判断输入的身份证号在职工系统是否已经存在
if id_num in identity_list:
return "员工身份证信息重复,请重新输入!"
# id_num.isalnum():输入的身份证号码是否字符或数字组成
# id_num.decimal():输入的身份证号码是否是由纯数字组成
if len(id_num) != 18 or not (id_num.isalnum()):
return "输入身份证信息无效,请重新输入!"
return ""
# 职员id合法检测
def id_check(id_num):
# 定义一个列表存储所有职员编号,便于后续对输入的职员编号重复性检测
id_list = list()
# 遍历每个员工的信息
for temp_dict in work_list:
# 从员工字典信息中获取职员编号添加到列表id_list_list
id_list.append(temp_dict["id"])
# 判断输入的职员编号在职工系统是否已经存在
if id_num in id_list:
return "员工ID信息重复,请重新输入!"
# 判断输入的职员编号是否为5位
if len(id_num) != 5:
return "员工ID应为五位数,请重新输入!"
return ""
def gui_show(info_list=[], insert=False):
root = tkinter.Tk()
root.title("职员管理系统")
root.geometry("1700x1000")
global order_str, order
def print_selection():
global order, order_str, name, identity, worker_id, index_info
name = en1.get()
identity = en2.get()
worker_id = en3.get()
index_info = en4.get()
order_str = libox1.get(libox1.curselection())
order = order_str[0]
# 关闭窗口,等待窗口刷新
root.destroy()
# 职员信息录入
if order == "1":
gui_show(work_list, insert=True)
# 显示所有职员信息
elif order == "2":
gui_show(work_list)
# 根据传入索引查看符合查询条件的职员信息
elif order == "3":
# 输入检索条件(支持姓名,身份证号,职员ID)
input_str = index_info
# 定义一个变量query_list用于存储查询到的职员信息
query_list = list()
# 遍历每个员工信息
for dict_info in work_list:
# 遍历每个员工信息中的每项数据
# value为项目对应的值;比如项目“姓名”对应值“张三”
for value in dict_info.values():
# 通过传入的检索条件匹配各个项目中的值
if input_str in value:
# value匹配正确,将该职员信息dict_info添加到查询结果列表query_list中
query_list.append(dict_info)
# 结束该员工的信息匹配
break
if not query_list:
order_str = "职员管理系统暂未收录该职工信息!"
# 将查询到的职员信息输出
gui_show(query_list)
# 删除职员
elif order == "4":
# 输入要删除的职员id
input_str = index_info
# 判断输入的职员编号是否为5位
if len(input_str) != 5:
print("员工ID应为五位数...")
return
# 遍历每个员工信息
for dict_info in work_list:
if input_str == dict_info["id"]:
# 将员工信息修改后重新写入文件(保存在磁盘中)用于永久保存
# 移除该职员信息
work_list.remove(dict_info)
order_str = "已成功删除职员编号为 {} 的职员!".format(input_str)
with open("worker_data.py", "w", encoding="utf8") as f:
# 将职员信息数据转换为字符串后以变量形式存储在py文件中(永久存储)
f.write("work_list = " + str(work_list))
break
else:
order_str = "职员管理系统暂未收录该职工信息!"
gui_show(work_list)
# 退出系统或错误指令
else:
exit()
lab_name = tkinter.Label(root, text="姓名: ", anchor='e', height=1)
lab_name.place(x=10, y=20)
en1 = tkinter.Entry(root, show=None)
en1.place(x=10, y=40, width=190, height=25)
lab_identify = tkinter.Label(root, text="身份证号: ", anchor='e', height=1)
lab_identify.place(x=10, y=80)
en2 = tkinter.Entry(root, show=None)
en2.place(x=10, y=100, width=190, height=25)
lab_id = tkinter.Label(root, text="职员ID: ", anchor='e', height=1)
lab_id.place(x=10, y=140)
en3 = tkinter.Entry(root, show=None)
en3.place(x=10, y=160, width=190, height=25)
if insert:
# 信息录入-添加对录入信息的合法检测,并保留输入框数据
lab_name['text'] += name_check(name)
en1.insert("end", name)
lab_identify['text'] += identity_check(identity)
en2.insert("end", identity)
lab_id['text'] += id_check(worker_id)
en3.insert("end", worker_id)
# 职员姓名录入检查,检测到非法输入会提示错误并要求重新输入
if not (name_check(name) + identity_check(identity) + id_check(worker_id)):
# 将输入的职员信息以字典形式存储到职员信息列表中
work_list.append({"name": name, "identity": identity, "id": worker_id})
# 将员工信息写入文件(保存在磁盘中)用于永久保存
with open("worker_data.py", "w", encoding="utf8") as f:
# 将职员信息数据转换为字符串后以变量形式存储在py文件中(永久存储)
f.write("work_list = " + str(work_list))
# 指令与提示信息展示框
var = tkinter.StringVar(value=order_str)
lab1 = tkinter.Label(root, bg="#6666FF", textvariable=var, width=30, height=2)
lab1.pack()
# 索引输入框
lab_index = tkinter.Label(root, text="索引输入", anchor='w', width=30, height=1)
lab_index.place(x=450, y=80, width=150)
en4 = tkinter.Entry(root, show=None, bg="#00FF66")
en4.place(x=450, y=100, width=200, height=30)
# 确认框
bt2 = tkinter.Button(root, bg="#FF9900", text="Enter", command=print_selection, activebackground="gray", width=10)
bt2.pack()
box_var = tkinter.StringVar()
box_var.set([
"1 - 信息录入",
"2 - 查看所有职员信息",
"3 - 根据索引查看职员信息",
"4 - 根据职员ID删除职员信息",
"0 - 退出系统"
])
libox1 = tkinter.Listbox(root, listvariable=box_var, width=25)
# 设置初始选中状态
libox1.selection_set(int(order) - 1)
libox1.pack()
columns = ("姓名", "身份证号", "职员ID")
# 创建表格
tree = ttk.Treeview(root, show="headings", columns=columns)
# 设置数据展示属性,作用:只是为了表格内容居中
# tree.column("姓名", anchor='center')
# tree.column("身份证号", anchor='center')
# tree.column("职员ID", anchor='center')
# 设置表头展示属性,作用:只是为了显示标题的名称
tree.heading("姓名", text="姓名")
tree.heading("身份证号", text="身份证号")
tree.heading("职员ID", text="职员ID")
# 插入数据到表格
for work_dict in info_list:
tree.insert("", 0, values=(work_dict['name'], work_dict['identity'], work_dict['id']))
tree.pack()
root.mainloop()
if __name__ == '__main__':
gui_show()
JSON数据存储(文件名:worker_data.py)
work_list = [{'id': '00001', 'name': 'ddw', 'identity': '123654789654563258'}, {'name': 'eeee', 'identity': '123658965236987569', 'id': '00005'}, {'name': 'dddd', 'identity': '145623698563256986', 'id': '00009'}, {'name': '忐忑', 'identity': '787878787878787878', 'id': '12121'}, {'name': 'www', 'identity': '123654789656568956', 'id': '00002'}, {'name': 'wee', 'identity': '420984699632356998', 'id': '00007'}, {'name': '微软', 'identity': '420984190001010001', 'id': '00006'}, {'name': 'micro', 'identity': '420984190906156559', 'id': '00000'}, {'name': 'sff', 'identity': '123654789653698569', 'id': '00055'}]