python基于Tkinter怎么实现人员管理系统
发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,小编给大家分享一下python基于Tkinter怎么实现人员管理系统,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言Tkinter是python内置的标准GUI库,基于Tkinte
千家信息网最后更新 2025年11月12日python基于Tkinter怎么实现人员管理系统
小编给大家分享一下python基于Tkinter怎么实现人员管理系统,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
前言
Tkinter是python内置的标准GUI库,基于Tkinter实现了简易人员管理系统,所用数据库为Mongodb
代码
时间宝贵!直接上代码!
from tkinter import *from tkinter.messagebox import *from tkinter import ttkimport pymongoimport tkinter as tkimport reimport timeimport datetimeimport pandas as pdfrom tkinter import filedialogfrom PIL import ImageTk,Imageimport tkinter#连接数据库client = pymongo.MongoClient(host="localhost", port=27017)db = client.syscol = 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('',pas8)# info.bind_all('',movetriangle)# info.bind_all('',movetriangle)# info.bind_all('',movetriangle)# .bind_all('',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('',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('',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('',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("<>", 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('',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('',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('',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('',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('',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('',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('',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('',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('',information)dataTreeview.bind('',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() 效果展示
看完了这篇文章,相信你对"python基于Tkinter怎么实现人员管理系统"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
提示
格式
错误
信息
输入
黑体
姓名
工号
年龄
生日
电话
搜索
人员
管理系统
系统
管理
薪资
更新
数据
文件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
成品短视频软件开发
松原网络安全电话
大数据与数据库技术的关系
数据库安全性创建角色
杭州戴尔霄龙服务器报价单
合法数据库共享软件
it软件开发包含什么意思
网络安全标语毛笔
云会议软件开发成本
构件软件开发
眉山网络安全展销
ssh 链接数据库 软件
数据库的安全约束
金融科技和互联网金融哪个
管理硬件设备的软件开发
黑盘发票上传参数设置服务器地址
游戏直播服务器怎么安装
网络安全法规培训心得体会
绝地求生组队服务器
老服务器盘
数据库是用什么操作的
计算机网络技术的职务要求
数据库的安全约束
上海夺畅网络技术有限公司融资
软件开发的第一个环节
软件开发预算明细表
保定艾力艾互联网科技有限公司
room 数据库
王者服务器能容纳多少人玩
安卓数据库连接sqlite