目录
本项目设计多个文件的融合,自行编写函数库并加以应用,在文章中会仔细说明清楚。并且该项目只需修改些许个人相关的内容即可运行,相关文件如下图:
对于tkinter库的使用不是很熟悉的,可以参考如下文章:点击这里
一、项目需求分析
根据用户需求,需要设计一款健康管理系统,能够实现管理员和用户的登录、查询、打卡等功能,相应的用户端需求如下:
普通用户:
1.用户登录:普通用户由管理员创建,只有登记过的人员才能登录系统。
2. 健康登记:按照管理员设定的登记项目进行健康登记,例如登记时间、体温、来源地(默认本地)、备注(例如航班、车次等)等,登记内容支持增、删、改、查。
3.个人查询:可查询自己的登记信息和所属班级的统计信息。
管理员端:
1.班级和人员管理:负责登记级班级及人员(即普通用户)信息,人员信息包括:学号、姓名、性别、班级、来源省市区等,支持信息的增、删、改。
2.登记项目维护:创建登记项目,登记项目包括登记时间、体温、来源地(默认本地)、备注(例如航班、车次等)等,支持对登记项目的增删改。
3.数据统计分析与展示:结合实际,实现对各类健康信息的统计,例如每天天已登记人数、未登记人数及相关人员信息,体温异常情况人数及相关个人信息等。
4.综合查询:可按班级、学号、日期范围、来源地、体温区间等要素进行组合查询或及统计(人数)。
二、开发工具以及使用需求
1.pycharm
2.mysql,在数据库中存有两张表,管理员表和用户表。
3.python语言
三、具体功能实现
1.主页面实现
主页面实现在相关文件的main.py中实现,主要是实现管理系统的登录界面,以及管理员和用户登录的API。实现结果如下:
main.py的具体代码如下:代码中的STreg()和ADreg()是管理员登录和用户登录的两个API,其下的两个引用如SR.Find(),则为两个软件包StudentRegister和AdministratorRegister中的函数。两个button中的command为两个API接口,是登录界面中的两个登录按钮。
import tkinter
from tkinter import *
import StudentRegister as SR
import AdministratorRegister as AR
import datetime
now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d %H:%M:%S")
class Mian:
def __init__(self):
root = Tk()
root.title('嵩山实验班学生健康统计系统 作者:栩珩;版本:1.0;时间:' + date)
Label(root, height=2, width=30, bg='lightblue', text='嵩山实验班学生健康统计系统', font=('black', 30)).grid(row=0, column=1)
img = tkinter.PhotoImage(file="D:/图片/郑州大学.png")
lable_img = tkinter.Label(root, image=img).grid(row=1, column=1)
def STreg():
SR.Find()
def ADreg():
AR.ADREG()
Button(root, text='用户登录', width=10, height=2, font=('black', 20), bg='LightBlue', command=STreg).grid(row=2,column=1,sticky=E)
Button(root, text='管理员登录', width=10, height=2, font=('black', 20), bg='LightBlue', command=ADreg).grid(row=2,column=1,sticky=W)
root.mainloop()
if __name__ == '__main__':
Mian()
2.管理员功能实现
1)管理员登录认证
实现结果如下图:
在该文档代码中,首先进行mysql数据库的管理员创建,我创建了两个管理员,可进行的授权操作有对数据库的增删改查,且权限不可另外授予他人。
管理员登录成功后,会显示“登录成功提示”,然后会出现管理员的相关操作,如下:
相关操作的功能在上文的需求分析中已经提到,该处只说明相关重要代码的含义。相应的button中的command是相关功能实现的API,只需将相应的API函数填入即可,相关的函数用法即与名字相呼应。
AdministratorRegister.py的具体代码如下:
from tkinter import *
import tkinter as tk
import tkinter.messagebox #消息框
import addstudents as AS
import deletes as DE
import updates as UP
import Finds as F
import queryalls as qr
import counts as CT
class ADREG:
def __init__(self):
def is_exits():
arg = {'sherry': 'xxxxxx', '栩珩': 'xxxxxxx'}
ps = password.get()
names = name.get()
for i in arg.keys():
if (names == i):
if (ps == arg[names]):
return True
def is_exit():
if (is_exits() == True):
tk.messagebox.showinfo('提示', '登录成功!')
root = Tk()
root.title('嵩山实验班学生信息管理系统管理员端')
def add():
AS.ADDS()
def edit():
UP.UPDATE()
def dele():
DE.DELETE()
def finds():
F.Finds()
def count():
CT.COUNT()
def queryall():
qr.QUERYALL()
Button(root, text='综合查询', width=10, height=2,bg='LightBlue',command=finds).grid(row=1,column=2,sticky=E)
Button(root, text='添加学生', width=10,height=2,bg='LightBlue',command=add).grid(row=1,column=3,sticky=E)
Button(root, text='编辑学生', width=10,height=2,bg='LightBlue',command=edit).grid(row=1,column=4,sticky=E)
Button(root, text='删除学生', width=10,height=2,bg='LightBlue',command=dele).grid(row=2,column=2,sticky=E)
Button(root, text='显示全部\n基本信息', width=10,height=2,bg='LightBlue',command=queryall).grid(row=2, column=3,sticky=E)
Button(root, text='人数统计', width=10,height=2,bg='LightBlue',command=count).grid(row=2, column=4,sticky=E)
else:
print("身份错误或密码错误!")
tk.messagebox.showinfo('提示', '身份错误或密码错误!')
root = Tk()
root.title('管理员登录验证')
Label(root, text='用户名:').grid(row=0)
Label(root, text='密码:').grid(row=1)
name = Entry(root, textvariable=StringVar())
password = Entry(root, textvariable=StringVar())
name.grid(row=0, column=1, padx=10, pady=10)
password.grid(row=1, column=1, padx=10, pady=5)
#ps = password.get()
#names = name.get()
Button(root, text='登录', width=10, command=is_exit).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=7, column=1, sticky=E, padx=10, pady=5)
if __name__=='__main__':
ADREG()
2)管理员相关功能的实现
首先是综合查询,实现结果如下:
在文本框中填入相应的内容,然后选择相应的属性,即可查询,例如:我进行体温区间的查询,36.0~38.0,结果如下:
Finds.py的具体代码如下:
from tkinter import *
import database as find
import tkinter as tk
import tkinter.messagebox #消息框
class Finds:
def __init__(self):
root = Tk()
root.title('综合查询')
Label(root, text='请输入:').grid(row=0)
id = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
def queryid():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市:', '住宿地址:']
result = Find1()
print(result)
if result:
for index, item in enumerate(result):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 7:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def queryclass():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市:', '住宿地址:']
result = Find2()
print(result)
#i = 0
if result:
for items in result:
for index,item in enumerate(items):
message=list[index]+str(item)+' '
text.insert(INSERT,message)
number+=1
if number==7:
text.insert(INSERT,'\n')
number=0
#i += 1
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def queryorigin():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市:', '住宿地址:']
result = Find3()
print(result)
if result:
for items in result:
for index,item in enumerate(items):
message=list[index]+str(item)+' '
text.insert(INSERT,message)
number+=1
if number==7:
text.insert(INSERT,'\n')
number=0
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def querytemperature():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '登记时间:', '体温','来源省市:','备注:']
result = Find4()
print(result)
if result:
for items in result:
for index,item in enumerate(items):
message=list[index]+str(item)+' '
text.insert(INSERT,message)
number+=1
if number==5:
text.insert(INSERT,'\n')
number=0
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def querydate():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '登记时间:', '体温','来源省市:','备注:']
result = Find5()
print(result)
if result:
for items in result:
for index,item in enumerate(items):
message=list[index]+str(item)+' '
text.insert(INSERT,message)
number+=1
if number==5:
text.insert(INSERT,'\n')
number=0
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def Find1():
sid = int(id.get())
#print(sid)
result =find.Query2(sid)
return result
def Find2():
sclass = str(id.get())
# print(sname)
result = find.Queryclass(sclass)
return result
def Find3():
sorigin = str(id.get())
# print(sorigin)
result = find.Queryorigin(sorigin)
return result
def Find4():
stemperature = str(id.get())
# print(stemperature)
result = find.Querytemperature(stemperature)
return result
def Find5():
sdate = str(id.get())
# print(sdate)
result = find.Querytdate(sdate)
return result
Button(root, text='ID查询', width=10, command=queryid).grid(row=7, column=2, sticky=W, padx=10, pady=5)
Button(root, text='班级查询', width=10, command=queryclass).grid(row=8, column=2, sticky=W, padx=10, pady=5)
Button(root, text='来源地查询', width=10, command=queryorigin).grid(row=9, column=2, sticky=W, padx=10, pady=5)
Button(root, text='体温区间查询\n(一位小数)', width=10, command=querytemperature).grid(row=10, column=2, sticky=W, padx=10, pady=5)
Button(root, text='按日期查询\n格式:X.X.X', width=10, command=querydate).grid(row=11, column=2, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10,command=root.destroy).grid(row=12, column=2, sticky=E, padx=10, pady=5)
text = tk.Text()
text.grid(row=3, column=1)
mainloop()
if __name__ == '__main__':
Finds()
五个相关的管理员综合查询操作,涉及五个相关的数据库查询函数,数据库相关操作会在database.py文件中说明。
然后是添加学生的功能实现,结果如下:
该界面addstudents.py代码如下:
from tkinter import *
import AddStudent as add
class ADDS:
def __init__(self):
root = Tk()
root.title('新增学生')
def ADD1():
add.AddStudent1()
def ADD2():
add.AddStudent2()
Button(root, text='用户表新增', width=10, command=ADD1).grid(row=1, column=0, sticky=W, padx=10, pady=5)
Button(root, text='管理员表新增', width=10, command=ADD2).grid(row=1, column=1, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=1, column=2, sticky=E, padx=10, pady=5)
root.mainloop()
if __name__=='__main__':
ADDS()
该界面AddStudent.py代码如下:
from tkinter import *
import database as add
class AddStudent1:
def __init__(self):
root=Tk()
root.title('新增学生')
Label(root, text='学号:').grid(row=0)
Label(root, text='登记时间:').grid(row=1)
Label(root, text='体温(一位小数):').grid(row=2)
Label(root, text='来源地:').grid(row=3)
Label(root, text='备注:').grid(row=4)
id=Entry(root,textvariable=StringVar())
date=Entry(root,textvariable=StringVar())
temperature=Entry(root,textvariable=StringVar())
origin = Entry(root, textvariable=StringVar())
remark = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
date.grid(row=1, column=1, padx=10, pady=5)
temperature.grid(row=2, column=1, padx=10, pady=5)
origin.grid(row=3, column=1, padx=10, pady=5)
remark.grid(row=4, column=1, padx=10, pady=5)
def adds1():
sid=int(id.get())
sdate=date.get()
stemperature=temperature.get()
sorigin = origin.get()
sremark = remark.get()
add.Add1(sid, sdate, stemperature, sorigin, sremark)
id.delete(0, END)
date.delete(0, END)
temperature.delete(0, END)
origin.delete(0, END)
remark.delete(0, END)
Button(root,text='添加',width=10,command=adds1).grid(row=5,column=0,sticky=W,padx=10,pady=5)
Button(root,text='取消',width=10,command=root.destroy).grid(row=5,column=1,sticky=E,padx=10,pady=5)
root.mainloop()
class AddStudent2:
def __init__(self):
root=Tk()
root.title('新增学生')
Label(root, text='学号:').grid(row=0)
Label(root, text='姓名:').grid(row=1)
Label(root, text='年龄:').grid(row=2)
Label(root, text='性别:').grid(row=3)
Label(root, text='班级:').grid(row=4)
Label(root, text='来源省市:').grid(row=5)
Label(root, text='住宿地址:').grid(row=6)
id=Entry(root,textvariable=StringVar())
name=Entry(root,textvariable=StringVar())
age=Entry(root,textvariable=StringVar())
gender = Entry(root, textvariable=StringVar())
cla = Entry(root, textvariable=StringVar())
origin = Entry(root, textvariable=StringVar())
address = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
name.grid(row=1, column=1, padx=10, pady=5)
age.grid(row=2, column=1, padx=10, pady=5)
gender.grid(row=3, column=1, padx=10, pady=5)
cla.grid(row=4, column=1, padx=10, pady=5)
origin.grid(row=5, column=1, padx=10, pady=5)
address.grid(row=6, column=1, padx=10, pady=5)
def adds2():
sid=int(id.get())
sname=name.get()
sage=int(age.get())
sgender = gender.get()
scla = cla.get()
sorigin = origin.get()
saddress = address.get()
add.Add2(sid, sname, sage, sgender, scla, sorigin, saddress)
id.delete(0, END)
name.delete(0, END)
age.delete(0, END)
gender.delete(0, END)
cla.delete(0, END)
origin.delete(0, END)
address.delete(0, END)
Button(root,text='添加',width=10,command=adds2).grid(row=7,column=0,sticky=W,padx=10,pady=5)
Button(root,text='取消',width=10,command=root.destroy).grid(row=7,column=1,sticky=E,padx=10,pady=5)
root.mainloop()
添加学生的操作,管理员可以进行两个表的操作,即管理员可以进行管理员表操作,和用户表操作,如果管理员表中没有的用户,则该用户不能进行用户登录。
可以看出,该操作是先进行选择,再进行添加操作,两个界面有先后顺序之分,后者的界面体现在前者button中command的API接口中。而后者的commandAPI接口对应的是数据库中的增加语句的实现。
然后是管理员的编辑学生和删除学生的功能实现,其实现思路和上述的添加学生的思路一直,在此就不必赘述了,只提供相应代码即可。
删除学生:
deletes.py的代码如下:
from tkinter import *
import Delete
class DELETE:
def __init__(self):
root = Tk()
root.title('删除学生')
def DEL1():
Delete.Dele1()
def DEL2():
Delete.Dele2()
Button(root, text='用户表删除', width=10, command=DEL1).grid(row=1, column=0, sticky=W, padx=10, pady=5)
Button(root, text='管理员表删除', width=10, command=DEL2).grid(row=1, column=1, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=1, column=2, sticky=E, padx=10, pady=5)
root.mainloop()
if __name__=='__main__':
DELETE()
Delete.py的代码如下:
from tkinter import *
import database as delete
class Dele1:
def __init__(self):
root = Tk()
root.title('删除学生')
Label(root, text='学号:').grid(row=0)
id = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
def deles():
sid = int(id.get())
delete.Delete1(sid)
id.delete(0,END)
Button(root, text='删除', width=10, command=deles).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10,command=root.destroy).grid(row=7, column=1, sticky=E, padx=10, pady=5)
root.mainloop()
class Dele2:
def __init__(self):
root = Tk()
root.title('删除学生')
Label(root, text='学号:').grid(row=0)
id = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
def deles():
sid = int(id.get())
delete.Delete2(sid)
id.delete(0,END)
Button(root, text='删除', width=10, command=deles).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10,command=root.destroy).grid(row=7, column=1, sticky=E, padx=10, pady=5)
root.mainloop()
编辑学生:
updates.py的代码如下:
from tkinter import *
import Update as udp
class UPDATE:
def __init__(self):
root = Tk()
root.title('修改学生')
def UDP1():
udp.Update1()
def UDP2():
udp.Update2()
Button(root, text='用户表修改', width=10, command=UDP1).grid(row=1, column=0, sticky=W, padx=10, pady=5)
Button(root, text='管理员表修改', width=10, command=UDP2).grid(row=1, column=1, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=1, column=2, sticky=E, padx=10, pady=5)
root.mainloop()
if __name__=='__main__':
UPDATE()
Update.py的代码如下:
from tkinter import *
import database as update
class Update1:
def __init__(self):
root = Tk()
root.title('修改学生')
Label(root, text='学号:').grid(row=0)
Label(root, text='登记时间:').grid(row=1)
Label(root, text='体温(一位小数):').grid(row=2)
Label(root, text='来源地:').grid(row=3)
Label(root, text='备注:').grid(row=4)
id = Entry(root, textvariable=StringVar())
date = Entry(root, textvariable=StringVar())
temperature = Entry(root, textvariable=StringVar())
origin = Entry(root, textvariable=StringVar())
remark = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
date.grid(row=1, column=1, padx=10, pady=5)
temperature.grid(row=2, column=1, padx=10, pady=5)
origin.grid(row=3, column=1, padx=10, pady=5)
remark.grid(row=4, column=1, padx=10, pady=5)
def upd1():
sid = int(id.get())
stemperature = temperature.get()
sdate = date.get()
sorigin = origin.get()
sremark = remark.get()
update.Update1(sid, sdate, stemperature, sorigin, sremark)
id.delete(0, END)
temperature.delete(0, END)
date.delete(0, END)
origin.delete(0, END)
remark.delete(0, END)
Button(root, text='修改', width=10, command=upd1).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=7, column=1, sticky=E, padx=10, pady=5)
root.mainloop()
class Update2:
def __init__(self):
root = Tk()
root.title('修改学生')
Label(root, text='学号:').grid(row=0)
Label(root, text='姓名:').grid(row=1)
Label(root, text='年龄:').grid(row=2)
Label(root, text='性别:').grid(row=3)
Label(root, text='班级:').grid(row=4)
Label(root, text='来源省市:').grid(row=5)
Label(root, text='住宿地址:').grid(row=6)
id = Entry(root, textvariable=StringVar())
name = Entry(root, textvariable=StringVar())
age = Entry(root, textvariable=StringVar())
gender = Entry(root, textvariable=StringVar())
cla = Entry(root, textvariable=StringVar())
origin = Entry(root, textvariable=StringVar())
address = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
name.grid(row=1, column=1, padx=10, pady=5)
age.grid(row=2, column=1, padx=10, pady=5)
gender.grid(row=3, column=1, padx=10, pady=5)
cla.grid(row=4, column=1, padx=10, pady=5)
origin.grid(row=5, column=1, padx=10, pady=5)
address.grid(row=6, column=1, padx=10, pady=5)
def upd2():
sid = int(id.get())
sname = name.get()
sage = int(age.get())
sgender = gender.get()
scla = cla.get()
sorigin = int(origin.get())
saddress = address.get()
update.Update2(sid, sname, sage, sgender, scla, sorigin, saddress)
id.delete(0, END)
name.delete(0, END)
age.delete(0, END)
gender.delete(0, END)
cla.delete(0, END)
origin.delete(0, END)
address.delete(0, END)
Button(root, text='修改', width=10, command=upd2).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=7, column=1, sticky=E, padx=10, pady=5)
root.mainloop()
再然后就是显示全部信息的操作,实现如下:
可见该操作仍可以进行两个表的操作,这是用户所需求的功能,示例中我进行了用户表达的查询,显示出里面的全部信息。
queryalls.py 具体代码如下:
from tkinter import *
import database as query
import tkinter as tk
import tkinter.messagebox #消息框
class QUERYALL:
def __init__(self):
root = Tk()
root.title('查询学生全部信息')
def queryall1():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '登记时间:', '体温','来源地:', '备注:']
result = query.QueryAll1()
print(result)
num = 0
if result:
for i in enumerate(result):
num = num + 1
s = '总人数为:' + str(num)
#print(result)
text.insert(INSERT, s)
text.insert(INSERT, '\n')
for items in result:
for index, item in enumerate(items):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 5:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
def queryall2():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市:', '住宿地址:']
result = query.QueryAll2()
print(result)
num = 0
if result:
for i in enumerate(result):
num = num + 1
s = '总人数为:' + str(num)
# print(result)
text.insert(INSERT, s)
text.insert(INSERT, '\n')
for items in result:
for index, item in enumerate(items):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 7:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
Button(root, text='用户表查询', width=10, command=queryall1).grid(row=1, column=0, sticky=W, padx=10, pady=5)
Button(root, text='管理员表查询', width=10, command=queryall2).grid(row=1, column=1, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=1, column=2, sticky=E, padx=10, pady=5)
text = tk.Text()
text.grid(row=3, column=1)
root.mainloop()
if __name__=='__main__':
QUERYALL()
最后是管理员的人数统计操作,实现如下:
在人数统计操作中,有三个可选项,分别是已登录人数,未登录人数和体温异常人数,需要说明在这三个操作中,会显示相关人员的在管理员表中的具体信息,这是管理员的特权,用来查看具体是谁进行了每天健康系统的登录,谁没有登录和谁的体温出现了异常,而且所有的人员显示都是当天的信息,之前登录过的信息不会显示,如若当天没有登录系统提交信息或者之前提交了信息而当天没有登录系统进行修改为当天日期,都会视为当天没有登录。而体温异常是指体温高于37.2℃。
counts.py具体代码如下:
from tkinter import *
import tkinter as tk
import tkinter.messagebox #消息框
import database
class COUNT:
def __init__(self):
root = Tk()
root.title('人数统计')
def COUNTS1():
text.delete('1.0', 'end') # 从第一行开始,全部删除
results = database.count1()
result = '已登录人数为:' + str(results)
print(result)
text.insert(INSERT, result)
text.insert(INSERT, '\n')
number = 0
list = ['学号:', '登记时间:', '体温', '来源省市:', '备注:']
result = database.Count1()
print(result)
if result:
for items in result:
for index, item in enumerate(items):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 5:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
def COUNTS2():
text.delete('1.0', 'end') # 从第一行开始,全部删除
results = database.count2()
result = '未登录人数为:' + str(results)
print(result)
text.insert(INSERT, result)
text.insert(INSERT, '\n')
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市:', '住宿地址:']
result = database.Count2()
print(result)
if result:
for items in result:
for index, item in enumerate(items):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 7:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
def COUNTS3():
text.delete('1.0', 'end') # 从第一行开始,全部删除
results = database.count3()
result = '体温异常人数为:' + str(results)
print(result)
text.insert(INSERT, result)
text.insert(INSERT, '\n')
number = 0
list = ['学号:', '登记时间:', '体温', '来源省市:', '备注:']
result = database.Count3()
print(result)
if result:
for items in result:
for index, item in enumerate(items):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 5:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
Button(root, text='已登录人数', width=10, command=COUNTS1).grid(row=1, column=0, sticky=W, padx=10, pady=5)
Button(root, text='未登录人数', width=10, command=COUNTS2).grid(row=1, column=1, sticky=W, padx=10, pady=5)
Button(root, text='体温异常情况人数', width=15, command=COUNTS3).grid(row=1, column=2, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10, command=root.destroy).grid(row=1, column=3, sticky=E, padx=10, pady=5)
text = tk.Text()
text.grid(row=3, column=1)
root.mainloop()
if __name__=='__main__':
COUNT()
三、用户功能的实现
1)用户登录认证及相关操作
实现结果如下:
在该界面中只需输入自己的学号即可登录,前提是该学生的学号已经在管理员表中存在了,即需要管理员进行信息录入之后,方能进行用户登录。
示例中进行了一个用户的登录,结果如下:
可见,用户登录成功后,不仅有相关的选项操作,还会将自己在管理员表中个人基本信息显示出来,比如学号,姓名,班级等。然后进行查询操作时,可以查看到自己在用户表中填写的信息,如学号,体温,登记时间等等,如果填写过,则会显示出来,如果没填写过,则会显示空白,然后可以进行添加或者更新操作,这些操作对标管理员操作中的人数统计操作,如查询已登录人数等等。
StudentRegister.py相关代码如下:
from tkinter import *
import database as find
import tkinter as tk
import AddStudent
import Update
import tkinter.messagebox #消息框
def add():
AddStudent.AddStudent1()
def upd():
Update.Update1()
class Find:
def __init__(self):
root = Tk()
root.title('身份验证')
Label(root, text='请输入学号:').grid(row=0)
id = Entry(root, textvariable=StringVar())
id.grid(row=0, column=1, padx=10, pady=10)
def queryid():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号:', '姓名:', '年龄:', '性别:', '班级:', '来源省市(默认本地):', '住宿地址:']
result = Find1()
print(result)
if result:
for index, item in enumerate(result):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 7:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '登录成功!')
root = Tk()
root.title('菜单')
Label(root, text='查询个人登记信息或者添加个人信息').grid(row=0, column=2)
# id = Entry(root, textvariable=StringVar())
# id.grid(row=0, column=1, padx=10, pady=10)
#Query()
Button(root, text='查询', width=10, command=Query).grid(row=7, column=0, padx=10, pady=5)
Button(root, text='添加', width=10, command=add).grid(row=7, column=1, padx=10, pady=5)
Button(root, text='更新', width=10, command=upd).grid(row=7, column=3, padx=10, pady=5)
Button(root, text='取消', width=10,command=root.destroy).grid(row=7, column=4, padx=10, pady=5)
#Query()
else:
print("查无此人")
tk.messagebox.showwarning('提示', '未查询到该学生!')
def Query():
text.delete('1.0', 'end') # 从第一行开始,全部删除
number = 0
list = ['学号','登记时间:', '体温:', '来源地(默认本地):', '备注:']
result = Find2()
print(result)
if result:
for index, item in enumerate(result):
message = list[index] + str(item) + ' '
text.insert(INSERT, message)
number += 1
if number == 5:
text.insert(INSERT, '\n')
number = 0
tk.messagebox.showinfo('提示', '显示成功!')
else:
print("未查询到相关信息!")
tk.messagebox.showwarning('提示', '未查询到相关信息')
def Find1():
sid = int(id.get())
#print(sid)
result =find.Query2(sid)
return result
#id.delete(0,END)
def Find2():
sid = int(id.get())
#print(sid)
result =find.Query1(sid)
return result
#id.delete(0,END)
Button(root, text='验证', width=10, command=queryid).grid(row=7, column=0, sticky=W, padx=10, pady=5)
Button(root, text='取消', width=10,command=root.destroy).grid(row=7, column=2, sticky=E, padx=10, pady=5)
text = tk.Text()
text.grid(row=3, column=1)
mainloop()
if __name__ == '__main__':
Find()
四、数据库连接
下面来介绍该项目中最重要的操作——数据库连接。为什么说它最重要呢?因为,所有的成员信息全部存储在数据库中,以上的所有管理员操作和用户操作都是基于数据库的增删改查操作,没有数据库的连接,以上操作全部完成不了。因此该database.py文件中包含了以上所有进行数据库操作的语句,即功能实现函数API的接口函数。
database.py具体代码如下:
import pymysql
import tkinter as tk
import tkinter.messagebox
import datetime
now = datetime.datetime.now()
date = now.strftime("%Y.%m.%d")
# 打开数据库
db=pymysql.connect(port=3306,user='xxx',password='xxxxxxx',database='db',charset='utf8')
# 使用cursor()方法获取操作游标
cursor=db.cursor()
sql = "use db"
cursor.execute(sql)
#sql = '''create table STtable(学号 varchar(20) not null primary key,登记时间 varchar(20) not null,体温 float not null,来源地 varchar(20) default '河南省郑州市', 备注 varchar(50))'''
#cursor.execute(sql)
#sql = '''create table ADtable(学号 varchar(20) not null primary key,姓名 varchar(10) not null,年龄 int,性别 enum("男","女"),班级 varchar(20),来源省市 varchar(20) default '河南省郑州市',住宿地址 varchar(20))'''
#cursor.execute(sql)
def IsExists2(id):
#sql='''select * from ADtable where 身份证号=%s'''
# 使用execute方法执行SQL语句
#arg = {'学号':id}
#cursor.execute(sql,arg['学号'])
#db.commit()
#row = cursor.fetchall()
row = Query2(id)
#print(row)
#print(cursor.rowcount)
if cursor.rowcount:
return True
else:
return False
def IsExists1(id):
#sql='''select * from STtable where 身份证号=%s'''
# 使用execute方法执行SQL语句
#arg = {'学号':id}
#cursor.execute(sql,arg['学号'])
#db.commit()
#row = cursor.fetchall()
row = Query1(id)
#print(row)
#print(cursor.rowcount)
if cursor.rowcount:
return True
else:
return False
def Add1(id,date,temperature,origin,remark):
if(IsExists2(id)==True and IsExists1(id)==False):
if (origin == ''):
sql = '''insert into STtable(学号,登记时间,体温,备注) values(%s,%s,%s,%s)'''
cursor.execute(sql, (id, date, temperature, remark))
db.commit()
# result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('添加成功')
tk.messagebox.showinfo('提示', '添加成功!')
else:
print('添加失败')
tk.messagebox.showerror('提示', '添加失败!')
else:
sql='''insert into STtable values(%s,%s,%s,%s,%s)'''
cursor.execute(sql,(id,date,temperature,origin,remark))
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('添加成功')
tk.messagebox.showinfo('提示','添加成功!')
else:
print('添加失败')
tk.messagebox.showerror('提示','添加失败!')
else:
print('该生身份不符合要求')
tk.messagebox.showwarning('提示', '该生身份不符合要求')
def Add2(id,name,age,gender,cla,origin,address):
#print(id)
#print(name)
if(IsExists2(id)==True):
print('该学生已存在')
tk.messagebox.showwarning('提示','该学生已存在')
else:
if (origin == ''):
sql = '''insert into ADtable(学号,姓名,年龄,性别,班级,住宿地址) values(%s,%s,%s,%s,%s,%s)'''
cursor.execute(sql, (id, name, age, gender, cla, address))
db.commit()
# result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('添加成功')
tk.messagebox.showinfo('提示', '添加成功!')
else:
print('添加失败')
tk.messagebox.showerror('提示', '添加失败!')
else:
sql='''insert into ADtable values(%s,%s,%s,%s,%s,%s,%s)'''
cursor.execute(sql,(id,name,age,gender,cla,origin,address))
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('添加成功')
tk.messagebox.showinfo('提示','添加成功!')
else:
print('添加失败')
tk.messagebox.showerror('提示','添加失败!')
def Delete1(id):
if(IsExists1(id)==True):
sql='''delete from STtable where 学号=%s'''
arg = {'学号': id}
cursor.execute(sql, arg['学号'])
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('删除成功')
tk.messagebox.showinfo('提示','删除成功!')
else:
print('删除失败')
tk.messagebox.showerror('提示','删除失败!')
else:
print('该学生不存在')
tk.messagebox.showwarning('提示','该学生不存在!')
def Delete2(id):
if(IsExists2(id)==True):
sql='''delete from ADtable where 学号=%s'''
arg = {'学号': id}
cursor.execute(sql, arg['学号'])
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('删除成功')
tk.messagebox.showinfo('提示','删除成功!')
else:
print('删除失败')
tk.messagebox.showerror('提示','删除失败!')
else:
print('该学生不存在')
tk.messagebox.showwarning('提示','该学生不存在!')
def Update2(id,name,age,gender,cla,origin,address):
if(IsExists2(id)==True):
if (origin == ''):
sql='''update ADtable set 姓名=%s,年龄=%s,性别=%s,班级=%s,来源省市=%s,住宿地址=%s where 学号=%s'''
cursor.execute(sql,(name,age,gender,cla,'河南省郑州市',address,id))
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('修改成功')
tk.messagebox.showinfo('提示','修改成功!')
else:
print('修改失败')
tk.messagebox.showerror('提示','修改失败!')
else:
sql = '''update ADtable set 姓名=%s,年龄=%s,性别=%s,班级=%s,来源省市=%s,住宿地址=%s where 学号=%s'''
cursor.execute(sql, (name, age, gender, cla, origin, address, id))
db.commit()
# result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('修改成功')
tk.messagebox.showinfo('提示', '修改成功!')
else:
print('修改失败')
tk.messagebox.showerror('提示', '修改失败!')
else:
print('未查询到该学生')
tk.messagebox.showwarning('提示','未查询到该学生!')
def Update1(id,date,temperature,origin,remark):
if(IsExists1(id)==True):
if (origin == ''):
sql='''update STtable set 登记时间=%s,体温=%s,来源地=%s,备注=%s where 学号=%s'''
cursor.execute(sql,(date,temperature,'河南省郑州市',remark,id))
db.commit()
#result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('修改成功')
tk.messagebox.showinfo('提示','修改成功!')
else:
print('修改失败')
tk.messagebox.showerror('提示','修改失败!')
else:
sql = '''update STtable set 登记时间=%s,体温=%s,来源地=%s,备注=%s where 学号=%s'''
cursor.execute(sql, (date, temperature, origin, remark, id))
db.commit()
# result=cursor.rowcount
row = cursor.fetchall()
if cursor.rowcount:
print('修改成功')
tk.messagebox.showinfo('提示', '修改成功!')
else:
print('修改失败')
tk.messagebox.showerror('提示', '修改失败!')
else:
print('未查询到该学生')
tk.messagebox.showwarning('提示','未查询到该学生!')
def Query2(id):
sql='''select * from ADtable where 学号 = %s'''
arg = {'学号':id}
cursor.execute(sql,arg['学号'])
db.commit()
result=cursor.fetchone()
# print(result)
return result
def Query1(id):
sql='''select * from STtable where 学号 = %s'''
arg = {'学号':id}
cursor.execute(sql,arg['学号'])
db.commit()
result=cursor.fetchone()
# print(result)
return result
def Queryclass(id):
sql='''select * from ADtable where 班级 = %s'''
arg = {'班级':id}
cursor.execute(sql,arg['班级'])
db.commit()
result=cursor.fetchall()
# print(result)
return result
def Queryorigin(id):
sql='''select * from ADtable where 来源省市 = %s'''
arg = {'来源省市':id}
cursor.execute(sql,arg['来源省市'])
db.commit()
result=cursor.fetchall()
# print(result)
return result
def Querytemperature(id):
sql='''select * from STtable where 体温 between %s and %s'''
tem1 = id[0:4]
tem2 = id[5:]
cursor.execute(sql,(tem1,tem2))
db.commit()
result=cursor.fetchall()
# print(result)
return result
def Querytdate(id):
sql='''select * from STtable where 登记时间 = %s'''
arg = {'登记时间':id}
cursor.execute(sql,arg['登记时间'])
db.commit()
result=cursor.fetchall()
# print(result)
return result
def QueryAll1():
sql='''select * from STtable'''
cursor.execute(sql)
db.commit()
result = cursor.fetchall()
return result
def QueryAll2():
sql='''select * from ADtable'''
cursor.execute(sql)
db.commit()
result = cursor.fetchall()
return result
def count1():
sql = '''select * from STtable where 登记时间 = %s'''
cursor.execute(sql,date)
db.commit()
result = cursor.fetchall()
num = 0
if result:
for i in enumerate(result):
num = num+1
return num
def count2():
sql = '''select * from ADtable'''
cursor.execute(sql)
db.commit()
result = cursor.fetchall()
num = 0
if result:
for i in enumerate(result):
num = num + 1
result = num - count1()
return result
def count3():
sql = '''select * from sttable where 登记时间 = %s and 体温>37.2'''
cursor.execute(sql,date)
db.commit()
result = cursor.fetchall()
num = 0
if result:
for i in enumerate(result):
num = num + 1
return num
def Count1():
sql = '''select * from STtable where 登记时间 = %s'''
cursor.execute(sql,date)
db.commit()
result = cursor.fetchall()
return result
def Count2():
sql = '''select * from ADtable where 学号 not in (select 学号 from STtable where 登记时间 = %s)'''
cursor.execute(sql,date)
db.commit()
result = cursor.fetchall()
return result
def Count3():
sql = '''select * from sttable where 登记时间 = %s and 体温>37.8'''
cursor.execute(sql,date)
db.commit()
result = cursor.fetchall()
return result
在该文本中首先进行数据库的连接和获取游标功能,以便后续sql语句的实现。因此,在实现该项目之前,你得有相关的数据库知识,并且下载好MySQL软件,并进行数据库的建立,将自己相应的user和password和database填写进database.py中相应的位置去,至于端口port一般不用管,就是3306。至于相关的函数功能,有一定的MySQL数据库基础就能够读懂了,无非就是用SQL语句进行MySQL的增加、删除、修改和删除操作,在此就不必一一赘述,只需要弄好数据库的连接就行了。对于MySQL数据库连接与使用不清楚的可以参考如下文章:点击这里
五、可执行程序的打包
对于软件输出,在这里还是使用pyinstaller进行打包。
多个.py文件打包命令格式如下:
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
该项目打包命令如下:
pyinstaller -F -i ./健康管理系统.ico -w 健康管理系统.py -p AddStudent.py -p addstudents.py -p AdministratorRegister.py -p counts.py -p database.py -p Delete.py -p deletes.py -p Finds.py -p queryalls.py -p StudentRegister.py -p Update.py -p updates.py --hidden-import AddStudent.py --hidden-import addstudents.py --hidden-import AdministratorRegister.py --hidden-import counts.py --hidden-import database.py --hidden-import Delete.py --hidden-import deletes.py --hidden-import Finds.py --hidden-import queryalls.py --hidden-import StudentRegister.py --hidden-import Update.py --hidden-import updates.py
命令中的“健康管理系统.ico”为可执行程序的图标,需要将png,jpg等其他格式的图片转换成ico文件格式,否则可能打包不成功。输入命令后,在运行结果的最后看见 successfully 那就是打包成功了,在dist文件夹中会有exe可执行文件。如下:
若对于pyinstaller使用来打包多个文件有不懂的可以参考如下文章:点击这里