python基于Tkinter怎么实现人员管理系统
短信预约 -IT技能 免费直播动态提醒
小编给大家分享一下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('<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()
效果展示
看完了这篇文章,相信你对“python基于Tkinter怎么实现人员管理系统”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341