python人员管理系统
XL不吃辣 人气:0前言
Tkinter是python内置的标准GUI库,基于Tkinter实现了简易人员管理系统,所用数据库为Mongodb
代码
时间宝贵!直接上代码!
from tkinter import * from tkinter.messagebox import * from tkinter import ttk import pymongo import tkinter as tk import re import time import datetime import pandas as pd from tkinter import filedialog from PIL import ImageTk,Image import tkinter #连接数据库 client = pymongo.MongoClient(host="localhost", port=27017) db = client.sys col = db.user #创建窗口 root = Tk() root.geometry('900x700') root.title('人员管理系统') #表头 img =Image.open(r'C:\Users\apple\Desktop\image.jpg') img = img.resize((900,68),Image.ANTIALIAS) img = ImageTk.PhotoImage(img) top=Label(root, text='人员管理系统',image=img,fg='black',font=('楷体', 20),compound='center', bitmap='error') top.pack(ipady=0,side=TOP, fill='x') #变量 sid = StringVar() name = StringVar() age = StringVar() salary = StringVar() phone = StringVar() birthday = StringVar() #控制函数 def add(): global info info=Toplevel() info.title("添加信息") info.geometry('400x400') button1=Button(info, text="确认",command=appendInfo,font=("黑体", 12)).place(relx=0.4, rely=0.8, width=100) Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1) Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1) Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1) Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1) Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1) Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1) text1=Entry(info, textvariable=sid).place(relx=0.3, rely=0.1, relwidth=0.45, height=25) sid.set("") text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25) name.set("") text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25) age.set("") text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25) salary.set("") text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25) phone.set("") text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25) birthday.set("") info.bind('<Return>',pas8) # info.bind_all('<KeyPress-Up>',movetriangle) # info.bind_all('<KeyPress-Down>',movetriangle) # info.bind_all('<KeyPress-Left>',movetriangle) # .bind_all('<KeyPress-Right>',movetriangle) def pitch_on(): global info info=Toplevel() info.title("删除信息") info.geometry('400x400') Label(info, text="是否确定删除以下信息",font=('楷体', 15)).place(relx=0.2, rely=0.01, relwidth=0.6) Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1) Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1) Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1) Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1) Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1) Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1) text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25) sid.set(sf[0]) text2=Entry(info, textvariable=name,state='disable').place(relx=0.3, rely=0.2, relwidth=0.45, height=25) name.set(sf[1]) text3=Entry(info, textvariable=age,state='disable').place(relx=0.3, rely=0.3, relwidth=0.45, height=25) age.set(sf[2]) text4=Entry(info, textvariable=salary,state='disable').place(relx=0.3, rely=0.4, relwidth=0.45, height=25) salary.set(sf[3]) text5=Entry(info, textvariable=phone,state='disable').place(relx=0.3, rely=0.5, relwidth=0.45, height=25) phone.set(sf[4]) text6=Entry(info, textvariable=birthday,state='disable').place(relx=0.3, rely=0.6, relwidth=0.45, height=25) birthday.set(sf[5]) button1=Button(info, text="确认",command=deleteInfo).place(relx=0.2, rely=0.8, width=100) button2=Button(info, text="关闭",command=des).place(relx=0.6, rely=0.8, width=100) info.bind('<Return>',pas33) def information2(): global info info=Toplevel() info.title("详细信息") info.geometry('400x400') button1=Button(info, text="更新信息",command=updateInfo).place(relx=0.4, rely=0.8, width=100) Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1) Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1) Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1) Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1) Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1) Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1) text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25) sid.set(sf[0]) text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25) name.set(sf[1]) text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25) age.set(sf[2]) text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25) salary.set(sf[3]) text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25) phone.set(sf[4]) text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25) birthday.set(sf[5]) info.bind('<Return>',pas11) def des(): info.destroy() def information(event): item=dataTreeview.selection() itemvalues=dataTreeview.item(item,'values') global info info=Toplevel() info.title("详细信息") info.geometry('400x400') button1=Button(info, text="更新信息",command=updateInfo).place(relx=0.4, rely=0.8, width=100) Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1) Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1) Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1) Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1) Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1) Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1) text1=Entry(info, textvariable=sid,state='disable').place(relx=0.3, rely=0.1, relwidth=0.45, height=25) sid.set(itemvalues[0]) text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25) name.set(itemvalues[1]) text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25) age.set(itemvalues[2]) text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25) salary.set(itemvalues[3]) text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25) phone.set(itemvalues[4]) text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25) birthday.set(itemvalues[5]) def isVaildDate(date): try: time.strptime(date, "%Y-%m-%d") return True except: return False def showAllInfo(): x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) def pas1(self): showAllInfo() def pas2(self): add() def pas3(self): pitch_on() def pas33(self): deleteInfo() def pas4(self): information2() def pas5(self): searchInfo() def pas55(self): search() def pas6(self): impInfo() def pas7(self): exp() def pas8(self): appendInfo() def pas9(self): global sf sf=dataTreeview.selection() sf=dataTreeview.item(sf,'values') def pas10(self): expInfo() def pas11(self): updateInfo() def appendInfo(): flag=1 if sid.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if sid.get().isdigit() == False: showerror(title='提示', message='格式错误') sid.set("") flag=0 if name.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if age.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if age.get().isdigit() == False: showerror(title='提示', message='格式错误') age.set("") flag=0 if salary.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if salary.get().isdigit() == False: showerror(title='提示', message='格式错误') salary.set("") flag=0 if phone.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if phone.get().isdigit() == False: showerror(title='提示', message='格式错误') phone.set("") flag=0 if birthday.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if isVaildDate(str(birthday.get())) == False: showerror(title='提示', message='格式错误') birthday.set("") flag=0 if flag==1: x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) list1 = { "work_number":sid.get(), "name":name.get(), "age":age.get(), "salary":salary.get(), "phone":phone.get(), "birthday":birthday.get() } col.insert_one(list1) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) info.destroy() def deleteInfo(): lst=list(col.find({},{'_id':0})) num = sid.get() flag = 0 for i in range(len(lst)): if str(num)==str(lst[i].get("work_number")): flag = 1 col.delete_one({'work_number':num}) break x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) info.destroy() #更新操作 def updateInfo(): sid_1 = sid.get() name_1 = name.get() age_1 = age.get() salary_1 = salary.get() phone_1 = phone.get() birthday_1 = birthday.get() flag=1 if sid.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if sid.get().isdigit() == False: showerror(title='提示', message='格式错误') sid.set("") flag=0 if name.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if age.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if age.get().isdigit() == False: showerror(title='提示', message='格式错误') age.set("") flag=0 if salary.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if salary.get().isdigit() == False: showerror(title='提示', message='格式错误') salary.set("") flag=0 if phone.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if phone.get().isdigit() == False: showerror(title='提示', message='格式错误') phone.set("") flag=0 if birthday.get() == "": showerror(title='提示', message='输入不能为空') flag=0 if isVaildDate(str(birthday.get())) == False: showerror(title='提示', message='格式错误') birthday.set("") flag=0 if flag==1: up={ "work_number":sid_1, "name":name_1, "age":age_1, "salary":salary_1, "phone":phone_1, "birthday":birthday_1 } old=col.find_one({'work_number': sid_1},{"_id": 0}) col.update_one(old, {'$set':up}) x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) showinfo(title='提示', message='更新成功!') des() #搜索页面 def search(): global info info=Toplevel() info.title("搜索信息") info.geometry('400x400') button1=Button(info, text="确认搜索",command=searchInfo).place(relx=0.4, rely=0.8, width=100) Label(info, text="工号:").place(relx=0.2, rely=0.1, relwidth=0.1) Label(info, text="姓名:").place(relx=0.2, rely=0.2, relwidth=0.1) Label(info, text="年龄:").place(relx=0.2, rely=0.3, relwidth=0.1) Label(info, text="薪资:").place(relx=0.2, rely=0.4, relwidth=0.1) Label(info, text="电话:").place(relx=0.2, rely=0.5, relwidth=0.1) Label(info, text="生日:").place(relx=0.2, rely=0.6, relwidth=0.1) text1=Entry(info, textvariable=sid).place(relx=0.3, rely=0.1, relwidth=0.45, height=25) sid.set("") text2=Entry(info, textvariable=name).place(relx=0.3, rely=0.2, relwidth=0.45, height=25) name.set("") text3=Entry(info, textvariable=age).place(relx=0.3, rely=0.3, relwidth=0.45, height=25) age.set("") text4=Entry(info, textvariable=salary).place(relx=0.3, rely=0.4, relwidth=0.45, height=25) salary.set("") text5=Entry(info, textvariable=phone).place(relx=0.3, rely=0.5, relwidth=0.45, height=25) phone.set("") text6=Entry(info, textvariable=birthday).place(relx=0.3, rely=0.6, relwidth=0.45, height=25) birthday.set("") info.bind('<Return>',pas5) #搜索操作 def searchInfo(): lst=list(col.find({},{'_id':0})) sid_1 = sid.get() name_1 = name.get() age_1 = age.get() salary_1 = salary.get() phone_1 = phone.get() birthday_1 = birthday.get() flag=1 # if sid.get().isdigit() == False: # # showerror(title='提示', message='格式错误') # sid.set("") # flag=0 # if age.get().isdigit() == False: # # showerror(title='提示', message='格式错误') # age.set("") # flag=0 # if salary.get().isdigit() == False: # # showerror(title='提示', message='格式错误') # salary.set("") # flag=0 # if phone.get().isdigit() == False: # # showerror(title='提示', message='格式错误') # phone.set("") # flag=0 # if isVaildDate(str(birthday.get())) == False: # # showerror(title='提示', message='格式错误') # birthday.set("") # flag=0 # if flag==0: # showerror(title='提示', message='格式错误') if flag==1: fla = 0 v=[] for i in range(len(lst)): if sid_1==str(lst[i].get("work_number")): fla = 1 v.append(lst[i].values()) continue elif name_1==lst[i].get("name"): fla = 1 v.append(lst[i].values()) continue elif age_1==lst[i].get("age"): fla = 1 v.append(lst[i].values()) continue elif salary_1==lst[i].get("salary"): fla= 1 v.append(lst[i].values()) continue elif phone_1==lst[i].get("phone"): fla = 1 v.append(lst[i].values()) continue elif birthday_1==lst[i].get("birthday"): fla= 1 v.append(lst[i].values()) continue if fla == 0: showerror(title='提示', message='无此信息,搜索失败!') x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) for i in v: dataTreeview.insert("", 1, text="line1", values=list(i)) des() def impInfo(): root1 = Tk() root1.withdraw() Folderpath = filedialog.askdirectory() #获得选择好的文件夹 Filepath = filedialog.askopenfilename() #获得选择好的文件 data=pd.read_csv(Filepath) for i in range(len(data.values)): j=list(data.values[i]) lst=col.find({},{'_id':0}) flag=0 for item in lst: i=list(item.values()) if str(j[0])== str(i[0]): flag=1 break if flag==0: list1 = { "work_number":str(j[0]), "name":j[1], "age":j[2], "salary":j[3], "phone":j[4], "birthday":j[5] } col.insert_one(list1) showinfo(title='提示', message='导入成功,可刷新!') x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) def xFunc(event): a=xVariable.get() def exp(): global info info=Toplevel() info.title("保存信息") info.geometry('500x200') button1=Button(info, text="确认备份",command=expInfo).place(relx=0.4, rely=0.8, width=100) Label(info, text="路径:",font=("黑体", 10)).place(relx=0.05, rely=0.2, relwidth=0.2) button2=Button(info, text="选择本地",command=selection).place(relx=0.8, rely=0.2, width=70) Label(info, text="文件名:",font=("黑体", 10)).place(relx=0.05, rely=0.4, relwidth=0.2) com = ttk.Combobox(info, textvariable=xVariable) com.place(relx=0.8, rely=0.4, width=70) com["value"] = (".csv", ".html", ".xlsx",".xls") # #给下拉菜单设定值 com.current(2) com.bind("<<ComboboxSelected>>", xFunc) # #给下拉菜单绑定事件 text1=Entry(info, textvariable=path).place(relx=0.25, rely=0.2, relwidth=0.5, height=25) text2=Entry(info, textvariable=file_name).place(relx=0.25, rely=0.4, relwidth=0.5, height=25) info.bind('<Return>',pas10) def selection(): root2 = Tk() root2.withdraw() Folderpath = filedialog.askdirectory() #获得选择好的文件夹 path.set(str(Folderpath)) def expInfo(): lst=col.find({},{'_id':0}) df = pd.DataFrame(list(lst)) ftp=xVariable.get() file = path.get()+'/'+file_name.get()+xVariable.get() print(file) if ftp=='.csv': df.to_csv(file,index=False,header=True) elif ftp=='.xlsx': df.to_excel(file,index=False,header=True) elif ftp=='.xls': df.to_excel(file,index=False,header=True) elif ftp=='.html': df.to_html(file,index=False,header=True) showinfo(title='提示', message='备份成功!') des() path = StringVar() file_name = StringVar() xVariable = tkinter.StringVar() #页面布局 Button(root, text="刷新信息",command=showAllInfo,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.15, width=120,height=50) root.bind('<F3>',pas1) Button(root, text="添加信息",command=add,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.25, width=120,height=50) root.bind('<F4>',pas2) Button(root, text="删除信息",command=pitch_on,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.35, width=120,height=50) root.bind('<BackSpace>',pas3) Button(root, text="更新信息",command=information2,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.45, width=120,height=50) root.bind('<Control-A>',pas4) Button(root, text="搜索信息",command=search,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.55, width=120,height=50) root.bind('<Control-S>',pas55) Button(root, text="导入数据",command=impInfo,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.65, width=120,height=50) root.bind('<Control-D>',pas6) Button(root, text="导出数据",command=exp,font=("黑体", 12),relief="raised", bd=7).place(relx=0.03, rely=0.75, width=120,height=50) root.bind('<Control-W>',pas7) dataTreeview = ttk.Treeview(root, show='headings',height=20, column=('sid', 'name', 'age','salary','phone','birthday')) dataTreeview.column('sid', width=10, anchor="center") dataTreeview.column('name', width=10, anchor="center") dataTreeview.column('age', width=10, anchor="center") dataTreeview.column('salary', width=10, anchor="center") dataTreeview.column('phone', width=10, anchor="center") dataTreeview.column('birthday', width=10, anchor="center") style_value = ttk.Style() style_value.configure("dataTreeview", rowheight=20, font=("微软雅黑", 30)) dataTreeview.tag_configure('tag_odd',background="red",foreground="blue") dataTreeview.tag_configure('tag_even',background="black",foreground="orange") scrollBar=Scrollbar(width=20) scrollBar.pack(side=RIGHT,fill=Y) scrollBar.config(command=dataTreeview.yview) dataTreeview.heading('sid', text='工号') dataTreeview.heading('name', text='姓名') dataTreeview.heading('age', text='年龄') dataTreeview.heading('salary', text='薪水') dataTreeview.heading('phone', text='电话') dataTreeview.heading('birthday', text='生日') dataTreeview.bind('<Double-Button-1>',information) dataTreeview.bind('<ButtonRelease-1>',pas9) x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) lst=col.find({},{'_id':0}) for item in lst: i=list(item.values()) dataTreeview.insert("", 1, text="line1", values=i) dataTreeview.place(relx=0.2,rely=0.1, relwidth=0.78,relheight=20) root.mainloop()
效果展示
加载全部内容