需求分析
(1)使用mysql存储学生和管理员信息
(2)通过tkinter模块创建图形界面,实现管理员的登录,对学生信息的增删改查,以及修改管理员自己的密码。
整个工程类与方法
数据库设计
使用mysql数据库创建
menege表和student表
menege表的创建:
create table manege(
user_name varchr(6) not null,
user_pwd char(6) not null,
user_state int(1) not null
primary key (user_name)
);
向表manege插入数据:
insert into manege values(admin,123456,1)
student表的创建
参考manege表的创建
插入数据即可
窗口设计
登录界面
界面展示
步骤:
(1)先创建login_page.py模块
(2)在该模块中创建LoginWindow类,继承于Tk
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
import datetime
import mainGUI
import pymysql
import os
class LoginWindow(Tk):
"""创建登录窗体的GUI界面以及登录的方法"""
#构造函数,在对象被创建后就自动运行
def __init__(self):
super().__init__() #先执行tk这个类的初始化
self.title("学生信息管理系统")
self.resizable(0,0) #窗体大小不允许变,两个参数分别代表x轴和y轴
#这三个参数都是为了传入下一个界面
self.user =""
self.pwd=""
self.state=1
# 加载窗体
self.setup_UI()
self.user_list = [] #存储用户信息
setup_UI()函数:
def setup_UI(self):
# ttk中控件使用style对象设定
self.Style01 = Style()
self.Style01.configure("user.TLabel",font = ("华文黑体",20,"bold"),foreground = "black")
self.Style01.configure("TEntry",font = ("华文黑体",20,"bold"))
self.Style01.configure("TButton",font = ("华文黑体",20,"bold"),foreground = "black",bg='red')
# 创建一个Label标签展示图片
self.Login_image = PhotoImage(file = "."+os.sep+"images"+os.sep+"back1.png")
self.Label_image = Label(self,image = self.Login_image,text="学生信息管理系统",compound=BOTTOM,font=("华文黑体",22,"bold"))
self.Label_image.pack(padx = 10,pady = 10)
# 创建一个Label标签 + Entry --- 用户名
self.Label_user = Label(self,text = "用户名:", style = "user.TLabel")
self.Label_user.pack(side = LEFT,padx = 10,pady = 10)
self.Entry_user = Entry(self,width = 12)
self.Entry_user.pack(side = LEFT,padx = 10,pady = 10)
# 创建一个Label标签 + Entry --- 密码
self.Label_password = Label(self, text = "密码:", style = "user.TLabel")
self.Label_password.pack(side = LEFT,padx = 10,pady = 10)
self.Entry_password = Entry(self, width=12,show = "*")
self.Entry_password.pack(side = LEFT,padx = 10,pady = 10)
# 创建一个按钮 --- 登录
self.Button_login = Button(self,text = "登录",width = 4,command=lambda:self.login())
self.Button_login.pack(side = LEFT,padx = 20,pady = 10)
load_main(self)函数
def load_main(self):
# 关闭当前窗体
#
self.destroy()
# 加载新窗体
if __name__ == '__main__':
main_Window = mainGUI.MainWindow(self.user,self.get_now_time(),self.pwd,self.state)
main_Window.mainloop()
login(self)函数
def login(self):
# 获取用户的用户名和密码
user = self.Entry_user.get()
password = self.Entry_password.get()
db = pymysql.connect(host="localhost",user="root",passwd="123456",database="student_manegement")
cursor = db.cursor()
sql = "select * from manege where user_name=%s"
cursor.execute(sql,user)
#将得到的管理员数据存放在列表中
self.user_list= cursor.fetchall()
print(self.user_list)
cursor.close()
db.close()
if len(self.user_list)!=0:
if 0 == self.user_list[0][2]:
messagebox.showinfo("系统消息","账号已禁用,请联系管理员")
else:
if password != str(self.user_list[0][1].strip().lower()):
messagebox.showinfo("系统消息","输入密码错误")
else:
messagebox.showinfo("系统消息","登录成功!")
self.user = self.user_list[0][0]
self.pwd = self.user_list[0][1]
self.state = self.user_list[0][2]
self.load_main()
else:
messagebox.showinfo("系统消息",'输入用户名不存在')
get_now_time(self)函数
def get_now_time(self):
today = datetime.datetime.today()
return ("%04d-%02d-%02d %02d:%02d:%02d"%(today.year,today.month,today.day,today.hour,today.minute,today.second))
创建登录界面对象
if __name__=='__main__':
this_login = LoginWindow()
print(this_login.get_now_time())
this_login.mainloop()
注意:这里一定要加上if __name__=='__main__'
否则会出现跳转不到主界面中
出现原因:
在主页面导入登录模块,因为python解释器是按顺序执行,import模块都在程序的最上方,执行到import login_page时,若没有if __name__=='__main__'
,则会执行创建登录界面,所以出现显示登录成功后,又跳转到登录界面。
主界面
界面展示
创建一个新的模块mainGUI.py模块
构造函数
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
import detailGUI
import change_pwd
import login_page
import pymysql
import os
import sys
class MainWindow(Tk):
def __init__(self,login_user,login_time,psw,state):
super().__init__()
self.title("主窗体")
self.geometry("1050x640+180+80")
self.resizable(0,0)
self["bg"]="cornflowerblue"
# 从登录界面传过来的管理员登录名和登录时间
self.current_user = login_user
self.current_time = login_time
self.current_psw = psw
self.current_state = state
# 加载页面UI
self.setup_UI()
# 读取学生信息
self.all_student_list =[] #使用一个list来存放读取的学生信息
self.load_file_student_info()
# 在treeview中加载学生信息
self.load_treeview(self.all_student_list)
# 定义一个存储查询结果的列表
self.query_result_list = []
self.current_student_list=[]
setup_UI(self)页面布局
def setup_UI(self):
# 设定Style
self.Style01 = Style()
self.Style01.configure("left.TPanedwindow",background ="white")
self.Style01.configure("right.TPanedwindow",background="white")
self.Style01.configure("TButton",width = 10,font = ("华文黑体",15,"bold"),background="white")
# Top_banner
self.Login_image = PhotoImage(file="."+os.sep+"images"+os.sep+"shouye.png")
self.Label_image = Label(self,image=self.Login_image)
self.Label_image.pack(padx=100,pady=10)
self.Lable_login_user = Label(self,text="当前用户:"+str(self.current_user).title()+"\n登录时间:"+self.current_time)
self.Lable_login_user.place(x=680,y=40)
# 左边:按钮区域,创建一个容器
self.Pane_left = PanedWindow(width=200,height=541,style="left.TPanedwindow")
self.Pane_left.place(x=4,y=94)
self.Pane_right = PanedWindow(width=830,height=540,style="right.TPanedwindow")
self.Pane_right.place(x=210,y=94)
# 添加左边按钮
# self.Button_image = PhotoImage(file="."+os.sep+"images"+os.sep+"tianjia.png")
self.Button_add = Button(self.Pane_left,text="添加学生",style="TButton",command=lambda:self.add_studnet())
self.Button_add.place(x=40,y=20)
self.Button_update = Button(self.Pane_left,text="修改学生",style="TButton",command=lambda:self.update_student())
self.Button_update.place(x=40,y=60)
self.Button_delete = Button(self.Pane_left,text="删除学生",style="TButton",command=lambda:self.delete_student())
self.Button_delete.place(x=40,y=100)
self.Button_modify = Button(self.Pane_left,text="更改密码",style="TButton",command=lambda:self.change_manege())
self.Button_modify.place(x=40,y=230)
# 右边:查询,TreeView
# self.Pane_right = PanedWindow(width=725,height=540,style="right.TPanedwindow")
# self.Pane_right.place(x=170,y=94)
# LabelFrame
self.LabelFrame_query = LabelFrame(self.Pane_right,text="学生信息查询",width=802,height=70)
self.LabelFrame_query.place(x=10,y=10)
# 添加控件
# 学号
self.Label_sno = Label(self.LabelFrame_query,text="学号:",style=None)
self.Label_sno.place(x=5,y=13)
self.Entry_sno = Entry(self.LabelFrame_query,width=8,style=None)
self.Entry_sno.place(x=60,y=15)
# 姓名
self.Label_name = Label(self.LabelFrame_query,text="姓名:",style=None)
self.Label_name.place(x=125,y=13)
self.Entry_name = Entry(self.LabelFrame_query,width = 8,style=None)
self.Entry_name.place(x=180,y=15)
# 电话
self.Label_mobile = Label(self.LabelFrame_query,text="电话:")
self.Label_mobile.place(x=245,y=13)
self.Entry_mobile = Entry(self.LabelFrame_query,width=8)
self.Entry_mobile.place(x=300,y=15)
# 学院
self.Label_academy = Label(self.LabelFrame_query,text="学院:")
self.Label_academy.place(x=365,y=13)
self.Entry_academy = Entry(self.LabelFrame_query,width=8)
self.Entry_academy.place(x=420,y=15)
# 查询按钮
self.Button_query = Button(self.LabelFrame_query,text="查询",width=4,command=lambda:self.get_query_result())
self.Button_query.place(x=520,y=8)
self.Button_showall = Button(self.LabelFrame_query,text="显示全部",width=8,command=lambda:self.load_all_student())
self.Button_showall.place(x=590,y=8)
# 添加TreeView控件
self.Tree = Treeview(self.Pane_right,columns=("sno","names","academy","gender","birthday","mobile","email","address"),show="headings",height=21)
# 设置每一个列的宽度和对齐方式
self.Tree.column("sno",width=100,anchor="center")
self.Tree.column("names",width=80,anchor="center")
self.Tree.column("academy",width=120,anchor="center")
self.Tree.column("gender",width=80,anchor="center")
self.Tree.column("birthday",width=100,anchor="center")
self.Tree.column("mobile",width=100,anchor="center")
self.Tree.column("email",width=100,anchor="center")
self.Tree.column("address",width=120,anchor="center")
# 设置每个列的标题
self.Tree.heading("sno",text="学号")
self.Tree.heading("names",text="姓名")
self.Tree.heading("academy",text="专业")
self.Tree.heading("gender",text="性别")
self.Tree.heading("birthday",text="生日")
self.Tree.heading("mobile",text="手机号码")
self.Tree.heading("email",text="邮箱地址")
self.Tree.heading("address",text="家庭住址")
self.Tree.place(x=10,y=80)
#为tree绑定双击事件,双击后显示点击学生的详细信息
self.Tree.bind("<Double-1>",self.view_student)
load_file_student_info(self)函数
# 读取文件/数据库中学生的信息
def load_file_student_info(self):
# 使用数据库读取信息
config={
"host":"localhost",
"user":"root",
"password":"123456",
"database":"student_manegement"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "select * from student"
cursor.execute(sql)
self.all_student_list = list(cursor.fetchall())
print("使用函数查找的所有学生:",len(list(self.all_student_list)))
cursor.close()
db.close()
load_treeview(self,current_list:list)方法加载treeview信息
def load_treeview(self,current_list:list):
# 判断是否有数据:
if len(current_list) == 0:
messagebox.showinfo("系统消息","没有数据加载")
else:
for index in range(len(current_list)):
self.Tree.insert("",index,values=(current_list[index][0],current_list[index][1],
current_list[index][9],current_list[index][2],current_list[index][3],
current_list[index][5],current_list[index][6],current_list[index][7]))
get_query_result(self)方法实现查询方法
# 准备查询条件:获取学号
query_condition = [self.Entry_sno.get(),self.Entry_name.get(),self.Entry_academy.get(),self.Entry_mobile.get()]
if len(query_condition[0])==0 and len(query_condition[1])==0 and len(query_condition[2])==0 and len(query_condition[3])==0:
messagebox.showinfo("系统消息","请输入要查找的内容!")
else:
for item in self.all_student_list:
if query_condition[0] in str(item[0]) and query_condition[1] in item[1] and query_condition[2] in item[9] and query_condition[3] in item[5]:
self.query_result_list.append(item)
for i in self.Tree.get_children():
self.Tree.delete(i)
self.load_treeview(self.query_result_list)
self.query_result_list.clear()
load_all_student(self)方法
实现点击显示全部后在treeview中显示并清空输入框中的内容
def load_all_student(self):
for i in self.Tree.get_children():
self.Tree.delete(i)
# 点击显示全部按钮后输入框清空
self.Entry_sno.delete(0,"end")
self.Entry_name.delete(0,"end")
self.Entry_academy.delete(0,"end")
self.Entry_mobile.delete(0,"end")
# 查找所有学生信息
self.load_file_student_info()
# 加载所有的学生信息到TreeView中
self.load_treeview(self.all_student_list)
load_detail_window(self,flag)函数
实现加载详细窗口
def load_detail_window(self,flag):
detail_window = detailGUI.DetailWindow(flag,self.current_student_list)
#等待detail_window被destroy,然后继续执行以下代码
self.wait_window(detail_window)
#tree中刷新信息
self.load_all_student()
add_student(self)函数
实现点击添加学生后跳转到详细窗口进行学生的添加
def add_studnet(self):
flag = 2
self.current_student_list=[]
self.load_detail_window(flag)
update_student(self)函数
实现在tree中点击一次某个学生+点击修改学生按钮跳转到详细窗口界面进行学生信息的修改,且把该点击的学生信息传入到详细窗口。
def update_student(self):
flag = 3
try:
item = self.Tree.selection()[0]
print(item)
Temp_student_list = self.Tree.item(item,"values")
# 遍历获得完整学生明细信息
for item in self.all_student_list:
if item[0] == int(Temp_student_list[0]):
self.current_student_list = item
self.load_detail_window(flag)
except:
messagebox.showinfo("系统消息","请选择右侧需要修改的学生!")
view_student(self,event)函数
实现当双击tree表格中的某一行数据后跳转到详细窗口界面,通过flag来设置详细窗口的控件状态。
def view_student(self,event):
flag = 1
# 获取Tree表格双击某一行的数据,selection()如果没有指定参数,则表明以列表形式返回所有的item
# 获取双击某一行的项目标识符
item = self.Tree.selection()[0]
print(item)
# 这个Tree表格中的数据,只是显示了部分数据,为了显示明细窗体,我们需要加载文件中的读取出来的完整信息
Temp_student_list = self.Tree.item(item,"values") #通过item方法,获取改列的所有元素,以元组的形式返回
print(Temp_student_list)
print("查看详情的所有学生",len(self.all_student_list))
# 遍历获得完整学生明细信息
for item in self.all_student_list:
if item[0] == int(Temp_student_list[0]):
self.current_student_list = item
# print(self.current_student_list)
self.load_detail_window(flag)
delete_student(self)函数
实现单击tree表格中的某一行数据后再点击删除学生按钮则删除该数据
def delete_student(self):
try:
item = self.Tree.selection()[0]
Temp_student_list = self.Tree.item(item,"values")
config={
"host":"localhost",
"user":"root",
"password":"123456",
"database":"student_manegement"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "delete from student where student_id=%s"
cursor.execute(sql,Temp_student_list[0])
num = messagebox.askokcancel("提示","确定要删除学生:%s吗?"%Temp_student_list[1])
if num:
db.commit()
messagebox.showinfo("系统消息","学生%s以被删除!"%Temp_student_list[1])
else:
messagebox.showinfo("系统消息","您取消了删除学生%s"%Temp_student_list[1])
cursor.close()
db.close()
self.load_all_student()
except:
messagebox.showinfo("系统消息","请选择右侧需要删除的学生!")
change_manege(self)函数
点击修改密码后跳到修改密码窗口进行管理员密码的修改
def change_manege(self):
update_pwd = change_pwd.Update_pwd(self.current_user,self.current_psw,self.current_state)
print("main窗口中的密码和状态",self.current_psw,self.current_state)
self.wait_window(update_pwd)
print("修改后密码:",update_pwd.psw)
print("修改后状态:",update_pwd.state)
if update_pwd.psw==self.current_psw and update_pwd.state==self.current_state:
pass
else:
messagebox.showinfo("系统消息","请重新登录!")
self.destroy()
new_login = login_page.LoginWindow()
new_login.mainloop()
学生详细信息窗口
添加学生信息页面展示
修改学生信息展示
查看学生详细信息展示
实现
新建一个detailGUI.py模块
init(self,flag,current_student)函数
# 学生窗体GUI基本布局
from tkinter import *
from tkinter import messagebox
from tkinter.ttk import *
import pymysql
import os
class DetailWindow(Toplevel):
def __init__(self,flag,current_student):
super().__init__()
self.title("学生明细信息")
self.geometry("700x600+600+150")
self.resizable(0,0) #不能改变窗体大小
self.flag = flag #接收从主窗口传过来的flag来控制自己窗口的控件状态
self.current_student_list = current_student #接收从主窗口床过来的学生信息
self.temp_list = []
# 加载控件
self.setup_UI()
load_student_detail(self)函数
展示出从主窗口点击的tree的某一行学生的详细信息
def load_student_detail(self):
if len(self.current_student_list) ==0:
# messagebox.showinfo("系统消息","没有任何数据需要展示!")
pass
else:
self.var_sno.set(self.current_student_list[0]) #学号
self.var_name.set(self.current_student_list[1]) #姓名
if "男" in self.current_student_list[2]: #性别
self.var_gender.set(1)
else:
self.var_gender.set(0)
self.var_age.set(self.current_student_list[3]) #出生日期
self.var_id.set(self.current_student_list[4]) #身份证
self.var_mobile.set(self.current_student_list[5]) #电话
self.var_email.set(self.current_student_list[6]) #邮箱
self.var_home.set(self.current_student_list[7]) #地址
self.var_studyin.set(self.current_student_list[8]) #入学时间
self.var_academy.set(self.current_student_list[9]) #专业
self.var_link.set(self.current_student_list[10]) #紧急联系人
self.var_link_phone.set(self.current_student_list[11]) #紧急联系人电话
setup_UI(self)函数实现界面布局
def setup_UI(self):
# detail_UI(self)
# 设置style
self.Style02 = Style()
self.Style02.configure("TPanedwindow")
self.Style02.configure("title.TLabel",font = ("微软雅黑",10,"bold"))
self.Style02.configure("TLabel",font = ("微软雅黑",14,"bold"))
self.Style02.configure("TButton",font =("微软雅黑",16,"bold"),foreground = "navy" ,width = 10)
self.Style02.configure("TEntry",font=("微软雅黑",16,"bold"),width = 10)
self.Style02.configure("large.TEntry",font=("微软雅黑",16,"bold"),width = 30)
self.Style02.configure("TRadiobutton",font=("微软雅黑",14,"bold"))
# 加载上面的banner
self.Login_image = PhotoImage(file = "."+os.sep+"images"+os.sep+"shouye.png")
self.Lable_image = Label(self,image=self.Login_image)
self.Lable_image.pack()
# 添加一个title
self.var_title = StringVar()
self.Label_title = Label(self,text="==明细窗体==",style="title.TLabel")
self.Label_title.place(x=500,y=40)
# 加载一个pane
self.Pane_detail = PanedWindow(self,width=690,height=450,style="TPanedwindow")
self.Pane_detail.place(x=5,y = 88)
# 添加属性
# 第一排:学号
self.Label_sno = Label(self.Pane_detail,text="学号:")
self.Label_sno.place(x=10,y=10)
self.var_sno = StringVar()
self.Entry_sno = Entry(self.Pane_detail,textvariable= self.var_sno,style="TEntry")
self.Entry_sno.place(x=62,y=15)
# 姓名
self.Label_name = Label(self.Pane_detail,text="姓名:",style="TLabel")
self.Label_name.place(x=240,y=10)
self.var_name = StringVar()
self.Entry_name = Entry(self.Pane_detail,textvariable=self.var_name,style = "TEntry")
self.Entry_name.place(x=300,y=15)
# 性别
self.Label_gender = Label(self.Pane_detail,text="性别:").place(x=480,y=10)
self.var_gender = IntVar()
self.Radio_man = Radiobutton(self.Pane_detail,text="男",variable=self.var_gender,value = 1,style="TRadiobutton")
self.Radio_man.place(x=540,y=10)
self.Radio_woman = Radiobutton(self.Pane_detail,text="女",variable=self.var_gender,value=0,style="TRadiobutton")
self.Radio_woman.place(x=600,y=10)
# 第二排:出生日期
self.Label_age = Label(self.Pane_detail,text="出生日期:",style="TLabel")
self.Label_age.place(x=10,y=60)
self.var_age = StringVar()
self.Entry_age = Entry(self.Pane_detail,textvariable=self.var_age,style="TEntry")
self.Entry_age.place(x=110,y=65)
# 身份证号码
self.Label_id = Label(self.Pane_detail,text="身份证号码:",style="TLabel")
self.Label_id.place(x=280,y=60)
self.var_id = StringVar()
self.Entry_id = Entry(self.Pane_detail,textvariable=self.var_id,width =35)
self.Entry_id.place(x=400,y=65)
# 第三排:手机号码
self.Label_mobile = Label(self.Pane_detail,text="电话号码:",style="TLabel")
self.Label_mobile.place(x=10,y=110)
self.var_mobile = StringVar()
self.Entry_mobile = Entry(self.Pane_detail,textvariable=self.var_mobile,style="TEntry")
self.Entry_mobile.place(x=110,y=115)
# 邮箱地址
self.Label_email = Label(self.Pane_detail,text="邮箱地址:",style="TLabel")
self.Label_email.place(x=280,y=110)
self.var_email = StringVar()
self.Entry_email = Entry(self.Pane_detail,textvariable=self.var_email,width =35)
self.Entry_email.place(x=400,y=115)
# 第四排:家庭住址
self.Label_home = Label(self.Pane_detail,text="家庭住址:",style="TLabel")
self.Label_home.place(x=10,y=160)
self.var_home = StringVar()
self.Entry_home = Entry(self.Pane_detail,textvariable=self.var_home,width=60)
self.Entry_home.place(x=110,y=165)
# 第五排:入学时间
self.Label_studyin = Label(self.Pane_detail,text="入学时间:",style = "TLabel")
self.Label_studyin.place(x=10,y=210)
self.var_studyin = StringVar()
self.Entry_studyin = Entry(self.Pane_detail,textvariable=self.var_studyin,style="TEntry")
self.Entry_studyin.place(x=110,y=215)
# 专业
self.Label_academy = Label(self.Pane_detail,text="专业:",style="TLabel")
self.Label_academy.place(x=320,y=210)
self.var_academy = StringVar()
self.Entry_academy = Entry(self.Pane_detail,textvariable=self.var_academy,width = 25)
self.Entry_academy.place(x=400,y=215)
# 第六排:紧急联系人
self.Label_link = Label(self.Pane_detail,text="紧急联系人:",style="TLabel")
self.Label_link.place(x=10,y=260)
self.var_link = StringVar()
self.Entry_link = Entry(self.Pane_detail,textvariable=self.var_link,style="TEntry")
self.Entry_link.place(x=140,y=265)
# 紧急联系人电话
self.Label_link_phone = Label(self.Pane_detail,text="紧急联系人电话:",style="TLabel")
self.Label_link_phone.place(x=320,y=260)
self.var_link_phone = StringVar()
self.Entry_link_phone = Entry(self.Pane_detail,textvariable=self.var_link_phone,style="TEntry")
self.Entry_link_phone.place(x=500,y=265)
# 放置两个按钮
self.Button_save = Button(self,text="保存",style="TButton",command=lambda:self.commit())
self.Button_save.place(x=350,y=550)
self.Button_exit = Button(self,text="关闭",style="TButton",command=lambda:self.close_window())
self.Button_exit.place(x=510,y=550)
#初始化界面数据及控件状态
self.load_student_detail()
self.load_windows_flag()
def load_windows_flag(self):函数
def load_windows_flag(self):
if self.flag == 1:
self.Label_title.configure(text="==查看学生明细==")
self.Button_save.place_forget()
self.Entry_sno["state"] = DISABLED
self.Entry_name["state"] = DISABLED
self.Radio_man["state"] = DISABLED
self.Radio_woman["state"] = DISABLED
self.Entry_age["state"] = DISABLED
self.Entry_id["state"] = DISABLED
self.Entry_mobile["state"] = DISABLED
self.Entry_email["state"] = DISABLED
self.Entry_home["state"] = DISABLED
self.Entry_studyin["state"] = DISABLED
self.Entry_academy["state"] = DISABLED
self.Entry_link["state"] = DISABLED
self.Entry_link_phone["state"] = DISABLED
elif self.flag == 2:
self.Label_title.configure(text = "==新建学生明细==")
elif self.flag == 3:
self.Label_title.configure(text = "==修改学生明细==")
self.Entry_sno["state"] = DISABLED
commit(self)函数
点击保存按钮,实现添加、修改学生信息
def commit(self):
if self.flag == 1:
pass
else :
#添加学生信息
if self.flag ==2:
break_flag=1
try:
while break_flag:
self.get_input()
if len(self.Entry_sno.get())==0 or len(self.Entry_name.get()) == 0 or len(self.Entry_id.get())==0 or len(self.Entry_mobile.get())==0 or len(self.Entry_studyin.get())==0 or len(self.Entry_academy.get())==0 or len(self.Entry_link.get())==0 or len(self.Entry_link_phone.get())==0:
messagebox.showinfo("系统消息","学号、姓名、身份证、电话号码、入学时间、专业、联系人及联系人电话都不能为空!")
else:
self.get_input()
sql = "insert into student values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
self.connect_database(sql,(self.temp_list[0],
self.temp_list[1],
self.temp_list[2],
self.temp_list[3],
self.temp_list[4],
self.temp_list[5],
self.temp_list[6],
self.temp_list[7],
self.temp_list[8],
self.temp_list[9],
self.temp_list[10],
self.temp_list[11]))
messagebox.showinfo("系统消息","学生信息添加成功")
break_flag=messagebox.askyesno("提示","继续添加学生?")
if break_flag:
self.Entry_sno.delete(0,"end")
self.Entry_name.delete(0,"end")
# self.var_gender.delete(0,"end")
self.Entry_age.delete(0,"end")
self.Entry_id.delete(0,"end")
self.Entry_mobile.delete(0,"end")
self.Entry_email.delete(0,"end")
self.Entry_home.delete(0,"end")
self.Entry_studyin.delete(0,"end")
self.Entry_academy.delete(0,"end")
self.Entry_link.delete(0,"end")
self.Entry_link_phone.delete(0,"end")
# 保存后销毁此窗口
self.destroy()
except pymysql.err.OperationalError as e:
messagebox.showerror("错误",e)
except pymysql.err.DataError as e:
messagebox.showerror("错误",e)
# 修改学生信息
elif self.flag == 3:
self.get_input()
print(self.temp_list)
if len(self.Entry_sno.get())==0 or len(self.Entry_name.get()) == 0 or len(self.Entry_id.get())==0 or len(self.Entry_mobile.get())==0 or len(self.Entry_studyin.get())==0 or len(self.Entry_academy.get())==0 or len(self.Entry_link.get())==0 or len(self.Entry_link_phone.get())==0:
messagebox.showinfo("系统消息","学号、姓名、身份证、电话号码、入学时间、专业、联系人及联系人电话都不能为空!")
else:
self.get_input()
sql = "update student set name=%s,gender=%s,brith_day=%s,ident=%s,mobile=%s,email=%s,home=%s,studyin=%s,academy=%s,link=%s,link_phone=%s where student_id = %s"
self.connect_database(sql,(self.temp_list[1],
self.temp_list[2],
self.temp_list[3],
self.temp_list[4],
self.temp_list[5],
self.temp_list[6],
self.temp_list[7],
self.temp_list[8],
self.temp_list[9],
self.temp_list[10],
self.temp_list[11],
self.temp_list[0]))
messagebox.showinfo("系统消息","学生信息修改成功!")
# 保存后销毁此窗口
self.destroy()
*connect_database(self,sql,value)函数进行对数据库的操作
def connect_database(self,sql,*value):
config={
"host":"localhost",
"user":"root",
"password":"123456",
"database":"student_manegement"
}
db = pymysql.connect(**config)
cursor = db.cursor()
cursor.execute(sql,*value)
db.commit()
# self.find_all=cursor.fetchall()
cursor.close()
db.close()
get_input(self)函数获取输入框中的数据
def get_input(self):
# 获取输入框信息保存到list中
self.temp_list = []
self.temp_list.append(int(self.Entry_sno.get()))
self.temp_list.append(self.Entry_name.get().strip())
if self.var_gender.get() == 1:
self.temp_list.append("男")
else:
self.temp_list.append("女")
self.temp_list.append(self.Entry_age.get().strip())
self.temp_list.append(self.Entry_id.get().strip())
self.temp_list.append(self.Entry_mobile.get().strip())
self.temp_list.append(self.Entry_email.get().strip())
self.temp_list.append(self.Entry_home.get().strip())
self.temp_list.append(self.Entry_studyin.get().strip())
self.temp_list.append(self.Entry_academy.get().strip())
self.temp_list.append(self.Entry_link.get().strip())
self.temp_list.append(self.Entry_link_phone.get().strip())
修改密码界面
修改密码界面展示
实现
新建一个change_pwd.py模块
from tkinter import *
from tkinter import messagebox
from tkinter.ttk import *
import pymysql
import os
class Update_pwd(Toplevel):
def __init__(self,user,psw,state):
super().__init__()
self.title("修改密码")
self.geometry("500x500+100+80")
self.resizable(0,0)
self["bg"]="cornflowerblue"
self.user = user
self.current_user=[]
self.psw = psw
self.state = state
self.setup_UI()
def setup_UI(self):
self.Style03 = Style()
self.Style03.configure("TPanedwindow",background="white")
self.Style03.configure("TRadiobutton",font=("微软雅黑",12,"bold"),background="white")
self.Style03.configure("TLabel",background="white")
self.Pane_change = Panedwindow(self,width=450,height=450,style="TPanedwindow")
self.Pane_change.place(x=25,y=25)
self.Lable_username = Label(self.Pane_change,text="用户名",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
self.Lable_username.place(x=50,y=100)
self.var_username = StringVar()
self.var_username.set(self.user)
self.Entry_username = Entry(self.Pane_change,textvariable=self.var_username,font=("微软雅黑",14,"bold"))
self.Entry_username.place(x=115,y=100)
self.Entry_username["state"] = DISABLED
self.Lable_userpwd_old = Label(self.Pane_change,text="原密码",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
self.Lable_userpwd_old.place(x=50,y=150)
self.var_userpwd_old = StringVar()
self.Entry_userpwd_old = Entry(self.Pane_change,textvariable=self.var_userpwd_old,font=("微软雅黑",14,"bold"))
self.Entry_userpwd_old.place(x=115,y=150)
self.Lable_userpwd = Label(self.Pane_change,text="新密码",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
self.Lable_userpwd.place(x=50,y=200)
self.var_userpwd = StringVar()
self.Entry_userpwd = Entry(self.Pane_change,textvariable=self.var_userpwd,font=("微软雅黑",14,"bold"))
self.Entry_userpwd.place(x=115,y=200)
self.Lable_userstate = Label(self.Pane_change,text="状态",width=100,font=("微软雅黑",14,"bold"),style="TLabel")
self.Lable_userstate.place(x=70,y=250)
self.var_userstate = StringVar()
self.Radio_frozen = Radiobutton(self.Pane_change,text="正常",variable=self.var_userstate,value = 1,style="TRadiobutton")
self.Radio_frozen.place(x=115,y=252)
self.Radio_disfrozen = Radiobutton(self.Pane_change,text="冻结",variable=self.var_userstate,value=0,style="TRadiobutton")
self.Radio_disfrozen.place(x=170,y=252)
self.Button_OK = Button(self.Pane_change,text="确定",command=lambda:self.commit())
self.Button_OK.place(x=80,y=300)
self.Button_Cancel = Button(self.Pane_change,text="取消",command=lambda:self.cancel())
self.Button_Cancel.place(x=220,y=300)
def load_database(self,sql,*value):
config={
"host":"localhost",
"user":"root",
"password":"123456",
"database":"student_manegement"
}
db = pymysql.connect(**config)
cursor = db.cursor()
cursor.execute(sql,*value)
db.commit()
self.current_user = cursor.fetchall()
cursor.close()
db.close()
def commit(self):
if len(self.var_userpwd.get())==0 or len(self.var_userpwd_old.get())==0 or len(self.var_userstate.get())==0:
messagebox.showinfo("系统信息","输入框不能为空!")
else:
manege_list = []
manege_list.append(self.var_userpwd_old.get())
manege_list.append(self.var_userpwd.get())
manege_list.append(self.var_userstate.get())
print(manege_list)
if manege_list[0]==self.psw:
sql = "select * from manege where user_name=%s"
self.load_database(sql,self.user)
sql = "update manege set user_pwd=%s,user_state=%s where user_name=%s"
self.load_database(sql,(manege_list[1],manege_list[2],self.user))
messagebox.showinfo("系统消息","更改成功,请重新登录")
print("修改密码后:",self.current_user)
self.psw = manege_list[1]
self.state=manege_list[2]
self.destroy()
else:
messagebox.showinfo("系统消息","原密码输入错误!请重新输入")
def cancel(self):
self.destroy()