千家信息网

python基于Tkinter怎么实现人员管理系统

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下python基于Tkinter怎么实现人员管理系统,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言Tkinter是python内置的标准GUI库,基于Tkinte
千家信息网最后更新 2026年11月03日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安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 深圳市人人互联网科技有限公司 广州淘业互联网络科技 互联网金融监管科技数据 善班互联网科技 奇酷互联网科技公司 互联网金融和金融科技 中国互联网金融科技基金 湖南洣水互联网科技有限公司扣款 字节跳动和互联网科技 互联网科技创新服务 互联网科技有哪些公司 港股科技和互联网 浙江互联网科技研学营 河南猎农互联网科技有限公司 东莞新华互联网科技学校 从那以后互联网科技有限公司 广州梦谷互联网科技有限公司领导 求路客互联网科技电话 重庆科技产业互联网有哪些 新华互联网科技学院 互联网与科技发展 与互联网科技公司 壹账通互联网科技 博兴的互联网电子科技公司 成都互联网科技公司100强 汽车互联网创新科技园 开一家科技互联网公司需要多少钱 中和天地互联网科技有限公司 安徽零酒互联网科技有限公司
0