前言
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()
效果展示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。