学生信息管理系统的开发

模块:  1. 系统登录界面   -->   logingui.py

2. 系统主界面     -->    maingui.py

3. 学生明细界面  -->   detailgui.py

4. 修改登录账号密码界面 -->  changepassword.py

5. GUI界面需要的图库

6. 数据   -->   (1) 登录账号相关文件 (loginuser_info.txt)        (2) 加载到主界面中显示的学生信息文件(student_info.txt)

#  图片部分

   ===》 注意:   这里的图片全部是png格式的   代码中窗体小图标是ico格式的可以通过网上转换图片生成ico格式的图片

#  文件部分

student_info.txt

95001,橘右京,20,男,15977693796,[email protected],日本大阪府大阪市,1988/9/12,110103199110186521,2010年6月18日,战士,橘子成精,18911213348

95002,韩信,19,男,18695719656,www.hanxin163.com,陕西省西安市韩台镇韩家村196号,1990/5/30,610103199110182714,2010年2月18日,刺客,韩悠悠,15977693321

95003,亚瑟,30,男,15834769921,[email protected],美国卡里福尼亚州,1981/7/21,370626798909071691,1978年7月17日,战士,亚历山大三世,18955789581

95004,王昭君,18,女,18977623571,[email protected],江苏省苏州市姑苏区,1998/12/3,320506198911112836,2014年9月30日,法师,王他爹,17966289971

95005,阿珂,17,女,13644893365,[email protected],山东省烟台市芝罘区,2000/3/23,370602198909071333,1999年9月9日,刺客,阿可可,15855372291

95006,白起,28,男,15962789930,[email protected],陕西省西安市,1978/12/31,610103199110182255,1978年12月30日,战士,白斩,18633462237

95007,苏烈,37,男,18912347689,[email protected],辽宁省黑龙江市,1975/9/30,3205061989167810056,1971年8月12日,战士,苏醒,15977889900

95008,虞姬,18,女,15942887540,[email protected],江苏省苏州市,1999/6/10,320506198911110056,1998年2月28日,射手,虞阵子,15890017789

95009,鲁班,16,男,18856713396,[email protected],河南省郑州市,2001/5/7,3865198911110011,2001年12月12日,射手,鲁班大师,15977889911

95010,狄仁杰,20,男,18867321541,[email protected],江苏省杭州市,1996/10/30,32050619891230056,1998年2月1日,射手,狄小兵,15778890071

95011,东方曜,21,男,15855667913,[email protected],陕西省西安市,1997/10/24,610103199110181412,2008年11月06日,战士,东方朔,18977239971

95012,嬴政,29,男,15588988888,[email protected],陕西省西安市,1981/4/12,610103199110182079,1999年5月31日,法师,嬴政他爹,18857613374

95013,蔡文姬,20,女,18666890013,[email protected],云南省大理市,1997/10/16,320506156911110056,1998年11月27日,辅助,蔡铭,18758092231

95014,甄姬,24,女,18562782278,[email protected],山西省大同市,1994/12/1,320506198911110056,1997年4月30日,法师,甄子丹,16599002345

95015,宫本武藏,27,男,18977889900,[email protected],日本大阪府大阪市,1982/3/19,3205061989112346,1982年2月21日,战士,宫本重生,17971889920

95016,明世隐,30,男,18662722447,[email protected],湖南省荆州市,1977/11/11,320506198911110216,1971年2月28日,辅助,明世隐公子,15888990011

95017,李元芳,17,男,15727458228,[email protected],湖北省武汉市,1999/12/11,32050619891111112234,2004年7月8日,射手,李元直,1857789012237

95018,盾山,37,男,18677882288,[email protected],山东省烟台市,1975/12/12,370602198909071472,1978年5月17日,辅助,盾地,15888887777

95019,诸葛亮,24,男,18911118888,[email protected],湖南省荆州市,1996/6/8,320506198911223344,1998年9月11日,法师,诸葛苏,15777812910

95020,赵云,27,男,18889966657,[email protected],河南省荆州市,1993/12/12,320506198922331005,1989年10月28日,战士,赵形,167877889109

95021,关羽,29,男,18811007788,[email protected],山东省烟台市,1981/12/14,370602198909070437,1990年1月12日,战士,关包,13877639961

95022,不知火舞,18,女,18677120091,[email protected],日本东京,1997/2/14,370602199702141471,2020年4月1日,法师,安迪,18612416097

95023,张飞,28,男,15811221190,[email protected],河南省郑州市,1985/1/30,320506198501301014,2020年1月1日,坦克,刘备,15988002581

loginuser_info.txt

liupeng,[email protected],1

admin,123.com,0

zhangsan,123.com,0

一,系统登录界面

思路: 1.   GUI界面的设计  -->   通过python自带的 tkinter 及 tkinter的加强版 tkinter.ttk 来实现登录界面的部署   (编码部署界面 --> 原因:为了日后习惯web开发)

2.   GUI界面下通过用户名密码进行身份验证     -->  读取到文件中的用户信息存入集合 --> 集合中通过元素[0][1][2]的方式管理学生信息的用户名,密码及锁定状态

3.   用户登录判定:  (1)  判断登录用户是否被锁定

(2) 判断登录用户是否存在

(3) 判断登录用户密码输入是否正确

(4) 判断登录用户密码登录是否超过3次,3次判定为锁定并写入到文件

代码实现:

from tkinter import *

importtkinter.ttk as ttkimportosfrom tkinter.messagebox import *

from datetime importdatetimeimportwangzhexiagu.GUI_student_system.maingui as manclassLogin_Windows(Tk):def __init__(self):"""主构造函数

1. 初始化登录界面窗体

2. 布局登录窗体并配置各个按键的属性

3. 实现用户验证功能"""super().__init__() #初始化框口

self.title("登录界面")

self.geometry("640x420+300+200") #通过控制图像大小可以通过+号来调整窗体出现的位置

self.resizable(0,0) #固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0

self.iconbitmap(R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\china.ico")#添加图片背景色

self["bg"] = "RoyalBlue" #传统tkinter中配置颜色方法

#加载窗体

self.SetUp_UI()#设置全局变量

self.file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\loginUserInfo_Data\loginuser_info.txt"self.user_list= [] #用户存储读取文件中所有的元素

self.misspasswd_counter = 0 #记录password错误的次数

self.input_user = "" #记录当前用户

self.input_password = "" #记录当前用户密码

self.current_login_list = [] #存储登录的账号和密码

#自动执行文件中文件的加载

self.load_localfile_info()#showinfo(message=self.user_list) #通过该提示可以直接看文件是否被读取成功!

#设置GUI页面窗体及控件的布局

defSetUp_UI(self):#通过style设置属性

self.Style01 =ttk.Style()

self.Style01.configure("TLabel",font=("微软眼黑",18,"bold"),background = "RoyalBlue",foreground = "white")

self.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")#加载窗体图片

self.login_img = PhotoImage(file =R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\school_demo.png")

self.label_img= ttk.Label(self,image =self.login_img)

self.label_img.pack(padx= 10,pady = 10)#创建Label + Entry ----用户名

self.username = ttk.Label(self,text = "用户名")

self.var_user= StringVar() #为了获取键盘输入

self.username.pack(side = LEFT,padx = 10, pady = 10)

self.user_entry= ttk.Entry(self,width = 15,textvariable =self.var_user,font=("微软眼黑",13,"bold"))#bold代表字体粗体

self.user_entry.pack(side = LEFT,padx = 10, pady = 10)#创建Label + Entry ----密码

self.password = ttk.Label(self,text = "密码")

self.var_password= StringVar()#为了获取键盘输入

self.password.pack(side = LEFT,padx = 10, pady = 10)

self.password_entry= ttk.Entry(self,show = "*",width = 15,textvariable=self.var_password,font=("微软眼黑",13,"bold")) #show方法代表密码密文

self.password_entry.pack(side = LEFT,padx = 10, pady = 10)#创建Button ---- 登录

self.button_login = ttk.Button(self,text = "登录",command =self.login)

self.button_login.pack(side= LEFT,padx = 10, pady = 10)defload_localfile_info(self):"""加载本地文件:

通过readline()方法一次读取一行的方式进行读取(避免日后文件过大一次性读取的弊端)

:return:"""

if notos.path.exists(self.file_path):

showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:

with open(self.file_path,mode= "r") as fd:

current_list= fd.readline() #一次读一行

while current_list: #表示直到current_list中所有元素被读完,循环结束

temp_list = current_list.split(",") #按照逗号把每个list中的元素分割出来

self.user_list.append(temp_list) #把分割后的每个元素重新添加到user_list列表中

current_list = fd.readline() #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。

except:

showinfo("系统信息","文件读取出现异常.请联系管理员!!")deflogin(self):"""用户身份验证功能的实现

1. 获取到文件中的用户名,密码,状态(是否被锁定)

2. 判断用户是否被锁定及是否是规定用户以外的非法用户登录(如果是拒绝登录)

3. 用户正确判断密码是否匹配,密码不匹配3次被锁定并写入到文件

:return:"""

#获取输入的用户名及密码

self.input_user =self.var_user.get()

self.input_password=self.var_password.get()#showinfo("提示信息","用户名:" + input_user + "\n" + "密码:" + input_password)

#实现身份验证

for index in range(len(self.user_list)): #这里的user_list 为之前从文件中读取重新存入list列表中的数据

#先判断用户名是否存在

if self.input_user.strip().lower() ==str(self.user_list[index][0]).strip().lower():#如果用户名存在,再判断用户名是否被锁定。1为锁定,0为active.

if "1" in str(self.user_list[index][2]):

showinfo("系统提示", "该用户被锁定.请联系管理员解锁后再登录。")break

else:#如果用户存在并且是active的状态再判断密码是否正确

if self.input_password != str(self.user_list[index][1]):

self.misspasswd_counter+=1 #初始值设置为0.如果上述条件不成立则循环加1次

if self.misspasswd_counter >=3: #设置密码错误次数最大不能超过3次

showinfo("系统提示","密码输入错误3次账号被锁定!")#改变锁定账户的状态(如果错误3次则改变文件中账户的状态把第3个元素变为1代表用户被锁定)

self.user_list[index][2] = "1\n" #这里需要加一个空格

#写入文件

self.write_file() #调用下列write_file()方法

else:

showinfo("系统提示", "密码错误,请重新输入")break

else:

self.misspasswd_counter= 0 #如果输入的password正确那么这里的错误次数还是为0

self.current_login_list =self.user_list[index]#用户密码输入都正确则加载主窗体()

self.upload_main()break

#这句话的意思是:循环到最后如果没有找到相同的用户名则用户判定为不存在!!!(这句话为重点,也是因为这句话才循环时用索引)

if index == len(self.user_list)-1:

showinfo("系统提示","输入的用户名不存在!")defwrite_file(self):"""写入文件":1.分2次写入第一次先清空原文件,第2次再逐一写入

2. 写入的是用户登录后反应的最新的状态信息

:return:"""

try:#[1] 先清空原文件(不放心可以先备份原文件再执行代码,不然数据会丢失)

with open(self.file_path,mode="w") as fd:

fd.write("") #不写任何东西代表清空

#[2] 再逐一把user_list中的数据写入到文件."a"代表追加写入

with open(self.file_path,mode = "a") as fd:for item inself.user_list:

fd.write(",".join(item)) #通过.join()方法指定写入时按照什么进行分割写入文件。这里指定的是按照逗号分割写入

except:

showinfo("系统信息","写入数据失败.")defupload_main(self):"""加载主窗体函数: 1. 用户验证通过后自动关闭当前窗体

2. 用户验证通过后自动加载主窗体

:return:"""

#关闭当前窗体

self.destroy()#加载主窗体

self.main_window =man.Main_Windows(self.current_login_list,self.get_login_time())#man.Main_Windows()中self.current_login_list及self.get_login_time()为加载登录主窗体后实现当前用户及登录时间显示的功能

defget_login_time(self):"""实现用户登录后自动加载登录时间功能

#通过import datetime这个模块中datetime.today()方法来实现.当然也可以通过其他方法实现比如时间元祖等

:return:"""today=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=Login_Windows()

this_login.mainloop()

用户登录界面

二,系统主界面

思路: 1.   GUI界面的设计  --> 同上同样是通过tkinter进行设计

(1)  上部 :   加载主窗体的图片   * 右下方显示当前登录的用户及当时登录时的系统时间  (这里是这部分的重点)

(2)  左部:   左边部分是功能区域 (用户的增删改及修改用户及密码的GUI界面部署)

(3)  右部:   右边部分分2大区域   1. 查询区域( 学号,姓名,年龄,手机号码,住址 等 来查询的GUI界面部署)

2. 数据展示区域(展示的是添加进来的student_info.txt中的数据,及查询后所展示的数据)

3. 查询区域中查询按钮及显示全部数据的GUI部署

(4)  总体 : 数据最终保存及退出界面的GUI界面部署

2.   上部:  如何显示当前用户及当前登录的系统时间

(1)  logingui界面中的login方法里,用户最终登录系统成功的节点下  --> 获取登录成功的用户名及密码 (这里主要用到的是用户名)  --> 存入到集合备用

(2)  logingui界面中,创建get_login_time()方法获取当前的系统时间

(3)  maingui主界面的构造函数中传参并实例化,把login界面中的集合在主界面下进行使用

(4)  主界面上部右下方的label窗口中,加载当前的用户和时间

3. 左部及右部 :  查看, 添加,修改 调用的都是同一个GUI界面. 如何实现在加载相同的窗口时,提示标题不相同

(1)  通过flag来标识登录的detailgui是查看还是添加,修改    -->  flag为全局变量   --> GUI窗体设计title部分不要写死 --> 通过获取title状态的方式识别

(2)  创建load_window_flag方法来控制每种状态下窗口的显示

1. flag =1 代表查看窗口  --> 查看窗口不允许更改任何信息,因此禁用detailgui查看窗口下的所有控件

2. flag = 2 代表添加窗口  --> 因为是添加所以不做任何限制

3. flag = 3 代表修改窗口   --> 学号绑定不许修改其他控件允许修改   -->可以更加优化修改窗口中每个控件的值的输入(因为时间原因我本人没有做更好的优化)

(3) 添加,修改,删除,修改密码等具体功能的实现   --> 详情见代码有注释

4. 右部:   TreeView控件中展示所有学员信息  -->通过查询功能的实现来展示   --> 详情见代码

代码实现:

from tkinter import *

importtkinter.ttk as ttkimportosfrom tkinter.messagebox import *

importwangzhexiagu.GUI_student_system.detailgui as dtimportwangzhexiagu.GUI_student_system.change_password as psclassMain_Windows(Tk):"""主窗体的构造函数

1. current_user,current_time的引入是为了加载logingui.py窗体中用户输入及加载登录时间记录时间的参数

2. 同样设计主窗体下界面的布局及配置"""

def __init__(self,current_login_user,current_time): #current_login_user为了实现登录信息的加载(记录logingui界面中当前用户是谁)

#current_time同样是为了记录当前用户登录的系统时间

super().__init__()

self.title("主窗体")

self.geometry("1200x700+1+20") #通过控制图像大小可以通过+号来调整窗体出现的位置

self.resizable(0, 0) #固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0

self.iconbitmap(R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\china.ico") #加载.ico文件到窗口小图标. 网上可以将png转成ico文件

#添加图片背景色

self["bg"] = "RoyalBlue"

#设置全局变量

self.login_times = current_time #为了记录用户的登录时间

self.all_list = [] #读取student_info.txt中所有的元素并存入all_list中

self.current_stu_list = [] #存储双击行匹配到的最终数据

self.get_number_result = [] #用户存储获取到的所有学员信息

self.file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\loginUserInfo_Data\student_info.txt"self.action_flag= 0 #设置查看/修改/添加学生信息的title值,默认为0

self.current_user_list = current_login_user #把login界面的list传到主界面接收

#加载窗体

self.Setup_UI()#自动执行函数

self.Load_local_Data() #自动加载数据(加载的是all_list中已经读取到的所有数据)

self.load_TreeView(self.all_list) #自动将all_list中每一行的数据加载到TreeView中展示

#将窗体的行为转化为方法

self.protocol("WM_DELETE_WINDOW",self.close_windows) #"WM_DELETE_WINDOW"为固定写法

defSetup_UI(self):"""布局主窗体的窗体并对其中的控件属性进行配置

:return:"""

#设置Sytle配置控件的属性

self.Style01 =ttk.Style()

self.Style01.configure("left.TPanedwindow",background="RoyalBlue")

self.Style01.configure("right.TPanedwindow", background="skyblue")

self.Style01.configure("TButton",font = ("微软雅黑",12,"bold"))

self.Style01.configure("TLabel", font=("微软雅黑", 10, "bold"))

self.Style01.configure("labframe.TButton", font=("微软雅黑", 10, "bold"))

self.Style01.configure("title1.TLabel", font=("微软雅黑", 10, "bold"),background = "lightblue")#加载窗体图片

self.login_img = PhotoImage(file=R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\1.png")

self.label_img= ttk.Label(self, image=self.login_img)

self.label_img.pack()#加载当前用户和时间

self.label_login_user = ttk.Label(self,text = "当前登录用户:" + str(self.current_user_list[0]).title() +

"\n登录时间:" + self.login_times,style = "title1.TLabel")#str(self.current_user_list[0]).title()为用户登录后的首字母显示未大写

self.label_login_user.place(x=1000,y=165)#左边按钮区域的布局

self.pan_left = ttk.PanedWindow(width =200,height=500,style ="left.TPanedwindow")

self.pan_left.pack(side= LEFT,padx=3,pady=1)#添加左边区域按钮

self.buttion_useradd = ttk.Button(self.pan_left,text = "添加学生",width =12,command =self.add_student)

self.buttion_useradd.place(x= 30,y = 20)

self.buttion_userupdate= ttk.Button(self.pan_left,text = "修改学生",width =12,command =self.update_student)

self.buttion_userupdate.place(x= 30,y = 60)

self.buttion_userdelete= ttk.Button(self.pan_left,text = "删除学生",width =12,command =self.delete_student)

self.buttion_userdelete.place(x= 30,y = 100)

self.buttion_changepassword= ttk.Button(self.pan_left,text = "更改密码",width =12,command =self.change_password_windows)

self.buttion_changepassword.place(x= 30,y = 140)#右边按钮区域的布局

self.pan_right = ttk.PanedWindow(width = 991,height = 500,style = "right.TPanedwindow")

self.pan_right.pack(side=LEFT)#添加查询区域(属于右边区域)

self.labelFrame_query = ttk.LabelFrame(self.pan_right,text = "学生信息",width =990,height = 60)

self.labelFrame_query.place(x=1,y=1)#添加控件

self.label_number = ttk.Label(self.labelFrame_query,text = "学号:")

self.label_stu_no=StringVar()

self.label_number.place(x=10,y =10)

self.entry_number= ttk.Entry(self.labelFrame_query,textvariable = self.label_stu_no,font = ("微软雅黑",10,"bold"),width=8)

self.entry_number.place(x=50,y =10)

self.label_name= ttk.Label(self.labelFrame_query,text = "姓名:")

self.get_stu_name=StringVar()

self.label_stu_name=StringVar()

self.label_name.place(x=130,y =10)

self.entry_name= ttk.Entry(self.labelFrame_query,textvariable = self.get_stu_name,font = ("微软雅黑",10,"bold"),width=10)

self.entry_name.place(x=170,y =10)

self.label_age= ttk.Label(self.labelFrame_query,text = "年龄:")

self.get_stu_age=StringVar()

self.label_age.place(x=270,y =10)

self.entry_age= ttk.Entry(self.labelFrame_query,textvariable=self.get_stu_age,font = ("微软雅黑",10,"bold"),width=5)

self.entry_age.place(x=310,y =10)

self.label_mobile= ttk.Label(self.labelFrame_query,text = "电话:")

self.get_stu_mobile=StringVar()

self.label_mobile.place(x=360,y =10)

self.entry_mobile= ttk.Entry(self.labelFrame_query,textvariable=self.get_stu_mobile,font = ("微软雅黑",10,"bold"),width=16)

self.entry_mobile.place(x=400,y =10)

self.label_address= ttk.Label(self.labelFrame_query,text = "住址:")

self.get_stu_address=StringVar()

self.label_address.place(x=540,y =10)

self.entry_address= ttk.Entry(self.labelFrame_query,textvariable=self.get_stu_address,font = ("微软雅黑",10,"bold"),width=20)

self.entry_address.place(x=590,y =10)

self.button_search= ttk.Button(self.labelFrame_query,text = "查询",width=6,style="labframe.TButton",command =self.get_student_result)

self.button_search.place(x=780, y=10)

self.button_homepage= ttk.Button(self.labelFrame_query,text = "返回主页面",width=10,style="labframe.TButton",command=self.load_all_data)

self.button_homepage.place(x=850, y=10)#添加TreeView控件

self.treeView = ttk.Treeview(self.pan_right,columns = ("学号","姓名","年龄","性别","电话","邮箱","家庭住址"),

show= "headings")#设置每一列的宽度和对齐方式

self.treeView.column("学号", width=80, anchor="center")

self.treeView.column("姓名", width=60, anchor="w") #w代表西面也就是左边对齐的意思

self.treeView.column("年龄", width=60, anchor="center")

self.treeView.column("性别", width=60, anchor="center")

self.treeView.column("电话", width=180, anchor="center")

self.treeView.column("邮箱", width=250, anchor="center")

self.treeView.column("家庭住址", width=298, anchor="w")#设置表头的标题文本

self.treeView.heading("学号", text="学号")

self.treeView.heading("姓名", text="姓名")

self.treeView.heading("年龄", text="年龄")

self.treeView.heading("性别", text="性别")

self.treeView.heading("电话", text="电话")

self.treeView.heading("邮箱", text="邮箱")

self.treeView.heading("家庭住址", text="家庭住址")#插入滚动条

#self.scrollBar = Scrollbar(self)

#self.scrollBar.pack(side=RIGHT,fill=Y)

#设置关联

#self.scrollBar.config(command = self.treeView.yview)

#展示treeView信息

self.treeView.place(x=1,y=60,height =450)#双击TreeView中某一行触发PopUp窗体

self.treeView.bind("",self.view_student) #是必须的Double以后的可以任意但是不能跟命令行重名

defLoad_local_Data(self):"""加载student_info.txt中的信息(本地文件的读取)

:return: 把文件中的每一个元素存储到 all_list 中"""

if notos.path.exists(self.file_path):

showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:

with open(self.file_path,mode= "r") as fd:

current_list= fd.readline() #一次读一行

while current_list:#表示直到current_list中所有元素被读完,循环结束

temp_list = current_list.split(",") #按照逗号把每个list中的元素分割出来

self.all_list.append(temp_list) #把分割后的每个元素重新添加到all_list列表中

current_list = fd.readline() #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。

except:

showinfo("系统信息","文件读取出现异常.请联系管理员!!")defload_TreeView(self,student_list:list):"""1. 判断all_list中的长度是否为0如果为0则没有数据被加载

2. 把数据加载到treeView中

:return:"""

#加载数据后清空TreeView

for i in self.treeView.get_children(): #固定用法

self.treeView.delete(i)#加载数据

if len(student_list) == 0: #这里的student_list是个参数变量传什么数据就是什么。这里最终传的事all_list中的数据在load_TreeView(self.all_list)中展示

showinfo("系统消息","没有数据被加载!")else:for index inrange(len(student_list)):

self.treeView.insert("",index,values =student_list[index])defget_student_result(self):"""1. 获取输入的值

2. 判断如果输入的值包含在all_list中那么把数据存入到get_number_result列表中

:return:

返回的是匹配到的学生编号的所有信息"""

#清空get_number_result中的数据(因为每次查询一个stu_number就显示一条.如果不清空就会每次查询的结果都会被显示)

self.get_number_result.clear()#获取输入的值

get_input =[]

get_input.append(self.label_stu_no.get().strip())

get_input.append(self.get_stu_name.get().strip())

get_input.append(self.get_stu_age.get().strip())

get_input.append(self.get_stu_mobile.get().strip())

get_input.append(self.get_stu_address.get().strip())#print(get_input)

#匹配学号把结果存入到get_number_result中(第一个元素学号必须填写)

for item inself.all_list:if get_input[0] in item[0] and get_input[1] in item[1] and get_input[2] in item[2]and get_input[3] in item[4] and get_input[4] in item[6]:

self.get_number_result.append(item)#print(self.get_number_result)

#把数据加载到TreeView中

self.load_TreeView(self.get_number_result)defload_all_data(self):"""重新加载一下treeView中的所有数据就是展开全部信息

:return:"""

#清空所有填写的内容文本框

self.label_stu_no.set("")

self.get_stu_name.set("")

self.get_stu_age.set("")

self.get_stu_mobile.set("")

self.get_stu_address.set("")#把all_list中的数据加载到TreeView

self.load_TreeView(self.all_list)defload_detail_windows(self):"""创建load_detail_windows方法调用class detailgui模块中的方法(加载学生明细窗体)

:return:"""detail_window= dt.Detail_Windows(self.action_flag,self.current_stu_list,self.all_list)#detailgui中传了几个参数就要load的几个参数

self.wait_window(detail_window) #通过self.wait_window()方法接收detail_window的值

returndetail_window.comp_infodefadd_student(self):

self.action_flag= 2 #如果action_flag值等于2则title值为添加学生信息

if self.load_detail_windows() == 1:

self.load_all_data()else:return

defupdate_student(self):

self.action_flag= 3 #如果action_flag值等于3则title值为修改学生信息

#获取双击行的数据

item =self.treeView.selection()[0]

temp_stu_list= self.treeView.item(item, "values")#因为双击行中的数据并不是我们想要的所有数据,因此我们还要遍历all_list中的元素。通过双击行获取的学号跟all_list中的学号做对比

#如果两个学号相等那么把all_list中对等的那一行的所有item存入到预备号的current_stu_list中

for item inself.all_list:if item[0] ==temp_stu_list[0]:

self.current_stu_list=item#加载数据

if self.load_detail_windows() == 1:

self.load_all_data()else:return

defview_student(self,event):"""1.获取选定行的数据

2.遍历所有学员信息,当前学员学号等于所有学员信息中学号的信息那么就读取选定行所有数据

3.重新加载数据

:param event:

:return:"""self.action_flag= 1 #如果action_flag值等于1则title值为查看学生信息

#固定方法获取双击行的数据

item =self.treeView.selection()[0]

temp_stu_list= self.treeView.item(item, "values")#因为双击行中的数据并不是我们想要的所有数据,因此我们还要遍历all_list中的元素。通过双击行获取的学号跟all_list中的学号做对比

#如果两个学号相等那么把all_list中对等的那一行的所有item存入到预备号的current_stu_list中

for item inself.all_list:if item[0] ==temp_stu_list[0]:

self.current_stu_list=item

self.load_detail_windows()defdelete_student(self):#获取选中行的数据

item =self.treeView.selection()[0]

temp_stu_list= self.treeView.item(item, "values")#提醒是否删除数据

choose= askyesno("删除确认","确定要删除学生信息【学号:" + temp_stu_list[0] + "姓名:" + temp_stu_list[1] + "] 信息吗?")ifchoose:#如果是执行下面代码

for index inrange(len(self.all_list)):if self.all_list[index][0] ==temp_stu_list[0]:

self.all_list.pop(index)break

#更新表格

self.load_all_data()

showinfo("系统消息","数据删除成功!")else:return

defclose_windows(self):"""1.提醒用户关闭窗口前是否保存数据

2.保存数居前先清空数据再保存数据

:return:"""choose= askyesno("系统关闭提醒","是否将修改的数据保存到文件?")ifchoose:try:

with open(self.file_path,mode="w") as fd:

fd.write("")

with open(self.file_path,mode="a") as fd:for item inself.all_list:

temp= ",".join(item)

temp= temp.replace("\n","") + "\n" #为了让光标换行

fd.write(temp)except:

showinfo("系统消息","写入文件出错!")#提醒

showinfo("系统消息","文件写入成功!")#关闭窗体

self.destroy()else:

self.destroy()defchange_password_windows(self):

this_password_windows=ps.change_User_password(self.current_user_list)#把list绑定到change_password_windows中

if __name__ == "__main__":

this_main_window=Main_Windows()

this_main_window.mainloop()

用户登录主界面

三,用户明细界面

思路:1.   GUI界面的设计  --> 同上同样是通过tkinter进行设计

2.  查看的情况下隐藏save保存按键

3. 添加的情况下实现点击save保存按键存入数据到TreeView中展示  --> 先不写入到文件 --> 关闭主窗体时再写入文件

4. 修改的情况下实现学号不允许修改其他允许修改

5. 修改密码的情况下,绑定当前登录的用户,提示用户输入新旧密码等

代码实现:

from tkinter import *

importtkinter.ttk as ttkfrom tkinter.messagebox import *

class Detail_Windows(Toplevel): #这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Toplevel

def __init__(self,action_flag:int,current_stu:list,all_stu_list:list):

super().__init__()

self.title("学生信息窗体")

self.geometry("700x600+300+100") #通过控制图像大小可以通过+号来调整窗体出现的位置

self.resizable(0, 0) #固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0

#self.iconbitmap(R"C:\Users\Administrator\python_图库\china.ico") # 加载.ico文件

self["bg"] = "RoyalBlue"

#设置全局变量

self.flag = action_flag #接收构造函数中action_flag中的值.(为了判断传进来的是添加,修改还是删除等状态值)

self.current_student_list = current_stu #接收构造函数中current_stu传进来的值(为了接收选中行中的值)

self.all_stu_list = all_stu_list #接收构造函数中all_stu_list传进来的值(强调主窗体中all_list中的值最终跟我们子窗体中all_stu_list中的值相同.因为传的是地址)

#加载窗体

self.Setup_UI()

self.load_windows_flag()defSetup_UI(self):#通过style设置属性

self.Style01 =ttk.Style()

self.Style01.configure("titel2.TLabel", font=("微软眼黑", 24, "bold"), foreground="darkred")

self.Style01.configure("TPanedwindow", background="lightcyan")#RoyalBlue

self.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")

self.Style01.configure("TLabel",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")

self.Style01.configure("TRadiobutton",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")#加载窗体图片

self.login_img = PhotoImage(file = R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\beijingtu.png")

self.label_img= ttk.Label(self,image =self.login_img)

self.label_img.pack()#添加Titile框体

self.var_titel =StringVar()

self.title_label= ttk.Label(self,textvariable=self.var_titel,style = "titel2.TLabel")

self.title_label.place(x= 20,y = 30)#添加一个Panewindows

self.pane = ttk.PanedWindow(self,width=696, height=450, style="TPanedwindow")

self.pane.place(x=2,y=98)#添加学员信息属性

self.label_number= ttk.Label(self.pane,text = "学号",style="stu_number.TLabel")

self.var_stunumber=StringVar()

self.label_number.place(x=30, y=20)

self.entry_number= ttk.Entry(self.pane,textvariable = self.var_stunumber,font=("微软眼黑",12, "bold"),width=8)

self.entry_number.place(x=80, y=20)

self.label_name= ttk.Label(self.pane,text = "姓名",style="TLabel")

self.var_stuname=StringVar()

self.label_name.place(x=170, y=20)

self.entry_name= ttk.Entry(self.pane,textvariable=self.var_stuname,font=("微软眼黑",12, "bold"),width=11)

self.entry_name.place(x=220, y=20)

self.label_age= ttk.Label(self.pane,text = "年龄",style="TLabel")

self.var_age=StringVar()

self.label_age.place(x=323, y=20)

self.entry_age= ttk.Entry(self.pane,textvariable=self.var_age,font=("微软眼黑",12, "bold"),width=5)

self.entry_age.place(x=370, y=20)

self.Label_genter= ttk.Label(self.pane, text="性别:")

self.Label_genter.place(x=440, y=20)

self.var_genter=IntVar()

self.radio_boy= ttk.Radiobutton(self, text="男", variable=self.var_genter, value=0)

self.radio_boy.place(x=520, y=116)

self.radio_gril= ttk.Radiobutton(self, text="女", variable=self.var_genter, value=1)

self.radio_gril.place(x=600, y=116)

self.label_brithday= ttk.Label(self.pane,text = "出生日期",style="TLabel")

self.var_brithday=StringVar()

self.label_brithday.place(x=30, y=70)

self.entry_brithday= ttk.Entry(self.pane,textvariable=self.var_brithday,font=("微软眼黑",12, "bold"),width=15)

self.entry_brithday.place(x=120, y=70)

self.label_personid= ttk.Label(self.pane,text = "身份证号码",style="TLabel")

self.var_personid=StringVar()

self.label_personid.place(x=320, y=70)

self.entry_personid= ttk.Entry(self.pane,textvariable=self.var_personid,font=("微软眼黑",12, "bold"),width=24)

self.entry_personid.place(x=430, y=70)

self.label_mobile= ttk.Label(self.pane,text = "手机号码",style="TLabel")

self.var_mobile=StringVar()

self.label_mobile.place(x=30, y=120)

self.entry_mobile= ttk.Entry(self.pane,textvariable=self.var_mobile,font=("微软眼黑",12, "bold"),width=18)

self.entry_mobile.place(x=120, y=120)

self.label_mail= ttk.Label(self.pane,text = "邮箱地址",style="TLabel")

self.var_mail=StringVar()

self.label_mail.place(x=320, y=120)

self.entry_mail= ttk.Entry(self.pane,textvariable=self.var_mail,font=("微软眼黑",12, "bold"),width=24)

self.entry_mail.place(x=430, y=120)

self.label_homeaddress= ttk.Label(self.pane,text = "家庭住址",style="TLabel")

self.var_homeaddress=StringVar()

self.label_homeaddress.place(x=30, y=170)

self.entry_homeaddress= ttk.Entry(self.pane,textvariable=self.var_homeaddress,font=("微软眼黑",12, "bold"),width=59)

self.entry_homeaddress.place(x=120, y=170)

self.label_admission_time= ttk.Label(self.pane,text = "入学时间",style="TLabel")

self.var_admission_time=StringVar()

self.label_admission_time.place(x=30, y=220)

self.entry_admission_time= ttk.Entry(self.pane,textvariable=self.var_admission_time,font=("微软眼黑",12, "bold"),width=18)

self.entry_admission_time.place(x=120, y=220)

self.label_professional= ttk.Label(self.pane,text = "职业",style="TLabel")

self.var_professional=StringVar()

self.label_professional.place(x=320, y=220)

self.entry_professional= ttk.Entry(self.pane,textvariable=self.var_professional,font=("微软眼黑",12, "bold"),width=15)

self.entry_professional.place(x=380, y=220)

self.label_emergency_contact= ttk.Label(self.pane,text = "紧急联系人",style="TLabel")

self.var_emergency_contact=StringVar()

self.label_emergency_contact.place(x=30, y=270)

self.entry_emergency_contact= ttk.Entry(self.pane,textvariable=self.var_emergency_contact,font=("微软眼黑",12, "bold"),width=15)

self.entry_emergency_contact.place(x=150, y=270)

self.label_emergency_mobile= ttk.Label(self.pane,text = "紧急联系人电话",style="TLabel")

self.var_emergency_mobile=StringVar()

self.label_emergency_mobile.place(x=320, y=270)

self.entry_emergency_mobile= ttk.Entry(self.pane,textvariable=self.var_emergency_mobile,font=("微软眼黑",12, "bold"),width=20)

self.entry_emergency_mobile.place(x=470, y=270)#添加保存,关闭按钮

self.save_buttion = ttk.Button(self, text="保存", width=10,command =self.submit)

self.save_buttion.place(x=480, y=560)

self.exit_buttion= ttk.Button(self, text="退出", width=10,command =self.close_windows)

self.exit_buttion.place(x=580, y=560)defload_windows_flag(self):"""设置加载学员信息的titel值(通过调用Setup_UI(self)中textvariable=self.var_titel变量的方式)

:return:"""

if self.flag == 1:

self.var_titel.set("== 查看学生信息 ==")

self.load_stu_detail()#控制学员信息的状态

self.save_buttion.place_forget() #隐藏save_buttion按键的固定写法

#通过控制entry变量中的["state"] = Disabled来禁用对象中的entry值.从而达到只读的效果

self.entry_number["state"] =DISABLED

self.entry_name["state"] =DISABLED

self.entry_age["state"] =DISABLED

self.radio_boy["state"] =DISABLED

self.radio_gril["state"] =DISABLED

self.entry_brithday["state"] =DISABLED

self.entry_homeaddress["state"] =DISABLED

self.entry_admission_time["state"] =DISABLED

self.entry_mail["state"] =DISABLED

self.entry_mobile["state"] =DISABLED

self.entry_personid["state"] =DISABLED

self.entry_professional["state"] =DISABLED

self.entry_emergency_contact["state"] =DISABLED

self.entry_emergency_mobile["state"] =DISABLEDelif self.flag == 2:

self.var_titel.set("== 添加学生信息 ==")elif self.flag == 3:

self.var_titel.set("== 修改学生信息 ==")#先填充数据

self.load_stu_detail()#控制学号不允许修改

self.entry_number["state"] =DISABLEDdefload_stu_detail(self):"""因为展示跟修改都需要调用后台数据.因此通过load_stu_detail方法进行调用

1.判断传入进来的值是否为0,如果是说明没有数据被加载

2.有数据的情况通过变量.set()方法来匹配每个元素对应本地数据的下标

性别:因为性别分男女分别设定了0跟1.因此这里要判断一下。一定要跟设定男女values的值对应上设定

:return:"""

if len(self.current_student_list) ==0:

showinfo("系统提示","没有数据需要展示!")else:

self.var_stunumber.set(self.current_student_list[0])#学号

self.var_stuname.set(self.current_student_list[1]) #姓名

self.var_age.set(self.current_student_list[2]) #年龄

if "男" in self.current_student_list[3]:

self.var_genter.set(0)else:

self.var_genter.set(1)

self.var_brithday.set(self.current_student_list[7])

self.var_mobile.set(self.current_student_list[4])

self.var_mail.set(self.current_student_list[5])

self.var_homeaddress.set(self.current_student_list[6])

self.var_personid.set(self.current_student_list[8])

self.var_admission_time.set(self.current_student_list[9])

self.var_professional.set(self.current_student_list[10])

self.var_emergency_contact.set(self.current_student_list[11])

self.var_emergency_mobile.set(self.current_student_list[12])defclose_windows(self):"""关闭窗口

:return:"""self.comp_info=0

self.destroy()defsubmit(self):if self.flag == 1: #view data

pass

elif self.flag == 2: #add data

#准备追加学生的数据

temp_list =[]if len(str(self.entry_number.get()).strip()) ==0:

showinfo("系统消息","学号不能为空!")else:

temp_list.append(str(self.entry_number.get()).strip())

temp_list.append(str(self.entry_name.get()).strip())

temp_list.append(str(self.entry_age.get()).strip())if self.var_genter.get() ==0:

temp_list.append("男")else:

temp_list.append("女")

temp_list.append(str(self.entry_mobile.get()).strip())

temp_list.append(str(self.entry_mail.get()).strip())

temp_list.append(str(self.entry_homeaddress.get()).strip())

temp_list.append(str(self.entry_brithday.get()).strip())

temp_list.append(str(self.entry_personid.get()).strip())

temp_list.append(str(self.entry_admission_time.get()).strip())

temp_list.append(str(self.entry_professional.get()).strip())

temp_list.append(str(self.entry_emergency_contact.get()).strip())

temp_list.append(str(self.entry_emergency_mobile.get()).strip())#追加数据

self.all_stu_list.append(temp_list)#提醒

showinfo("系统信息","学生信息添加成功!")#反馈信号给主窗体

self.comp_info = 1self.destroy()elif self.flag == 3: #update data

temp_list =[]if len(str(self.entry_number.get()).strip()) ==0:

showinfo("系统消息", "学号不能为空!")return

else:

temp_list.append(str(self.entry_number.get()).strip())

temp_list.append(str(self.entry_name.get()).strip())

temp_list.append(str(self.entry_age.get()).strip())if self.var_genter.get() ==0:

temp_list.append("男")else:

temp_list.append("女")

temp_list.append(str(self.entry_mobile.get()).strip())

temp_list.append(str(self.entry_mail.get()).strip())

temp_list.append(str(self.entry_homeaddress.get()).strip())

temp_list.append(str(self.entry_brithday.get()).strip())

temp_list.append(str(self.entry_personid.get()).strip())

temp_list.append(str(self.entry_admission_time.get()).strip())

temp_list.append(str(self.entry_professional.get()).strip())

temp_list.append(str(self.entry_emergency_contact.get()).strip())

temp_list.append(str(self.entry_emergency_mobile.get()).strip())#遍历集合

for index inrange(len(self.all_stu_list)):if self.all_stu_list[index][0] ==self.current_student_list[0]:

self.all_stu_list[index]=temp_list#提醒

showinfo("系统信息", "学生信息修改成功!")#反馈信号给主窗体

self.comp_info = 1

#关闭窗口

self.destroy()if __name__ == "__main__":

this_windows=Detail_Windows()

this_windows.mainloop()

学生明细界面

三,用户修改密码界面

#难点并不多因此直接上代码

代码实现:

from tkinter import *

importtkinter.ttk as ttkfrom tkinter.messagebox import *

importosclass change_User_password(Toplevel): #这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Toplevel

def __init__(self,current_user_list):

super().__init__()

self.title("修改密码")

self.geometry("600x500+300+100") #通过控制图像大小可以通过+号来调整窗体出现的位置

self.resizable(0, 0) #固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0

#self.iconbitmap(R"C:\Users\Administrator\python_图库\china.ico") # 加载.ico文件

self["bg"] = "RoyalBlue"

#定义全局变量

self.current_user_list = current_user_list #同样在change_User_password窗口中接收list的地址

self.file_path = R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\loginUserInfo_Data\loginuser_info.txt"self.get_all_userlist= [] #获取所有的账号密码

#加载setup_UI

self.Setup_UI()#初始化

self.var_loginuser.set(self.current_user_list[0]) #初始化登录的账号

#自动加载

self.get_all_loginuser()defSetup_UI(self):#通过style设置属性

self.Style01 =ttk.Style()

self.Style01.configure("titel3.TLabel", font=("微软眼黑", 20, "bold"), foreground="darkred")

self.Style01.configure("TPanedwindow", background="lightcyan")#RoyalBlue

self.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")

self.Style01.configure("TLabel",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")

self.Style01.configure("TRadiobutton",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")#加载窗体图片

self.login_img = PhotoImage(file = R"C:\Users\Administrator\PycharmProjects\untitled1\wangzhexiagu\GUI_student_system\photo\beijingtu.png")

self.label_img= ttk.Label(self,image =self.login_img)

self.label_img.pack()#添加Titile框体

self.title_label = ttk.Label(self,text="== 更改密码 ==",style = "titel3.TLabel")

self.title_label.place(x= 20,y = 30)#添加一个Panewindows

self.pane = ttk.PanedWindow(self,width=596, height=360, style="TPanedwindow")

self.pane.place(x=2,y=98)

self.label_login_user= ttk.Label(self.pane,text = "登录账号",style="stu_number.TLabel")

self.var_loginuser=StringVar()

self.label_login_user.place(x=170, y=60)

self.entry_login_user= ttk.Entry(self.pane,state = DISABLED,textvariable = self.var_loginuser,font=("微软眼黑",14, "bold"),width=16)

self.entry_login_user.place(x=270, y=60)

self.label_old_password= ttk.Label(self.pane,text = "旧密码",style="stu_number.TLabel")

self.var_old_password=StringVar()

self.label_old_password.place(x=170, y=120)

self.entry_old_password= ttk.Entry(self.pane,show = "*",textvariable = self.var_old_password,font=("微软眼黑",14, "bold"),width=16)

self.entry_old_password.place(x=270, y=120)

self.label_new_password= ttk.Label(self.pane,text = "新密码",style="stu_number.TLabel")

self.var_new_password=StringVar()

self.label_new_password.place(x=170, y=180)

self.entry_new_password= ttk.Entry(self.pane,show = "*",textvariable = self.var_new_password,font=("微软眼黑",14, "bold"),width=16)

self.entry_new_password.place(x=270, y=180)

self.label_reinput_password= ttk.Label(self.pane,text = "重新输入新密码",style="stu_number.TLabel")

self.var_reinput_password=StringVar()

self.label_reinput_password.place(x=120, y=240)

self.entry_reinput_password= ttk.Entry(self.pane,show = "*",textvariable = self.var_reinput_password,font=("微软眼黑",14, "bold"),width=16)

self.entry_reinput_password.place(x=270, y=240)#添加保存,关闭按钮

self.save_buttion = ttk.Button(self, text="保存", width=10,command =self.save_pass_windows)

self.save_buttion.place(x=380, y=470)

self.exit_buttion= ttk.Button(self, text="退出", width=10,command =self.close_pass_windows)

self.exit_buttion.place(x=480, y=470)defclose_pass_windows(self):

self.destroy()defsave_pass_windows(self):#获取登录账号相关的值

old_password =self.var_old_password.get()

new_password=self.var_new_password.get()

second_password=self.var_reinput_password.get()#判断旧密码是否真确

if old_password != self.current_user_list[1]:

showinfo("系统消息","输入的旧密码不正确!")return

#判断新密码跟旧密码是否相同

if new_password ==old_password:

showinfo("系统消息", "新密码不能跟旧密码相同!")return

#判断输入的新密码不能为空

if len(new_password.strip()) ==0:

showinfo("系统消息", "新密码不能为空!")return

#两次密码输入是否相同

if new_password !=second_password:

showinfo("系统消息", "两次密码输入不一致!")return

#修改密码

for index inrange(len(self.get_all_userlist)):if self.get_all_userlist[index][0] ==self.current_user_list[0]:

self.get_all_userlist[index][1] =new_password#完成更改(写入文件)

try:

with open(self.file_path,mode="w") as fd:

fd.write("")

with open(self.file_path,mode="a") as fd:for item inself.get_all_userlist:

temp= ",".join(item)

temp= temp.replace("\n","") + "\n"fd.write(temp)except:

showinfo("系统消息","写入文件出错.请联系管理员")#提示

showinfo("系统消息", "密码修改成功!")#关闭窗口

self.destroy()defget_all_loginuser(self):"""读取文件获取所有的账号信息保存到get_all

:return:"""

if notos.path.exists(self.file_path):

showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:

with open(self.file_path,mode= "r") as fd:

current_list= fd.readline() #一次读一行

while current_list:#表示直到current_list中所有元素被读完,循环结束

temp_list = current_list.split(",") #按照逗号把每个list中的元素分割出来

self.get_all_userlist.append(temp_list) #把分割后的每个元素重新添加到all_list列表中

current_list = fd.readline() #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。

except:

showinfo("系统信息","文件读取出现异常.请联系管理员!!")if __name__ == "__main__":

this_windows=change_User_password()

this_windows.mainloop()

用户修改密码界面

原文:https://www.cnblogs.com/liupengpengg/p/12671663.html

python的gui界面文件管理_【Python】学生信息管理系统_开发(GUI界面)相关推荐

  1. java查询学生信息_分别显示女生_女生学生基本信息的代码_java课程设计学生信息管理系统_毕业论文.doc...

    java课程设计学生信息管理系统_毕业论文 学 号: 课 程 设 计 题 目学生信息管理系统学 院计算机科学与信息工程学院专 业金融信息化服务外包班 级学生姓名指导教师 2015年12月28日 课程设 ...

  2. 添加老师信息的php学生信息管理,PHP+MySQL学生信息管理系统的开发与设计

    一直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对学生信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对学生信息进行管理,才能够更加积极的培养国家的栋梁 ...

  3. 基于PHP+MySQL学生信息管理系统的开发与设计

    一直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对学生信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对学生信息进行管理,才能够更加积极的培养国家的栋梁 ...

  4. asp.net学生信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

    一.源码特点         ASP.NET C# 学生信息管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发,开发环境为vs2010,数据库为sqlse ...

  5. 上海交通大学出版社python教材答案学生信息管理系统_学生信息管理系统(最终版)...

    <学生信息管理系统.doc>由会员分享,可免费在线阅读全文,更多与<学生信息管理系统(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1. ...

  6. 基于python 使用tk模块和mysql实现学生信息管理系统

    学生信息管理系统 好久没有发文啦,经过一段时间的学习,有所收获,写了个小项目,记录一下学习过程.好啦,废话不多说,我们直接说实现,看效果. 首先系统是有三个视图,一个管理员,一个教师,一个学生,运行效 ...

  7. Python学生信息管理系统的开发

    # 第一题:设计一个全局变量,来保存很多个学生信息:学生(学号, 姓名,年龄):思考要用怎样的结构来保存:# 第二题:在第一题基础上,完成:让用户输入一个新的学生信息(学号,姓名,年龄):你将其保存在 ...

  8. 基于GUI+MySQL技术的简单学生信息管理系统

    简单的学生信息管理系统 1. 需求分析 1.1 系统总体分析 1.2 用户系统分析 2. 课题及任务功能描述 2.1 课题研究背景 2.2 功能描述 3. 总体设计 3.1 系统总体设计 3.2 系统 ...

  9. 网上教学系统mysql课程设计_基于学生信息管理系统的数据库系统课程设计(MySQL)...

    题目:学生信息管理系统 1 系统需求分析 学校每年都有新生入学.老生毕业,还有其他各种人事变动.如何有效地管理这些学生 的信息,帮助学校和老师掌握学生的情况,这就是学生信息管理系统需要完成的功能. 1 ...

最新文章

  1. 离散傅里叶变换python_使用python实现离散时间傅里叶变换
  2. Spring Boot面试题
  3. udp协议的服务器是哪种类型,UDP协议
  4. 苹果iOS 15正式发布!一大波新功能上线,这几个被刷爆了
  5. 大数据背景下的互联网金融应用领域
  6. 拉普拉斯二阶锐化matlab,laplace(拉普拉斯)锐化matlab程序
  7. Nest.js 管道
  8. hadoop安装教程(一次填完所有的坑)
  9. 腾讯地图获取经纬度 Java计算距离工具类
  10. FME入门视频教程:第三节 FME界面及常用设置
  11. 用Python爬取QQ空间说说和相册!还不让我访问!
  12. 计算机不断重启 病毒,电脑中病毒后一直自动重启怎么样解决
  13. win10升级助手_Win7直接升级Win10,小编三种方法告诉你如何做到,建议收藏哦!
  14. 桌面运维问题快速定位原因的常用基本思路
  15. [HEOI2013] 钙铁锌硒维生素
  16. 【逍遥模拟器】注册微信提示环境异常怎么解决?
  17. 宝塔的安全防范-服务器防火墙配置经验分享
  18. 关于主从复制的超详细解析(全)
  19. C语言---char *与const char *
  20. MATLAB前馈神经网络newff

热门文章

  1. PS制作咖啡闹钟、故障文字
  2. unable to negotiate with xxxxx port xxx: no matching host key type found. Their offer: ssh-rsa
  3. Emoji处理方式大起底
  4. C++ 测试驱动开发
  5. 计算机图形学课程设计html源码,孔令德的计算机图形学实验及课程设计(VC++版)...
  6. 【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫
  7. 深入Vue2.x的虚拟DOM diff原理
  8. 仿穷游项目--bug集
  9. java编译release版本断言_关于Debug和Release之本质区别
  10. Qt For Android 第一步 环境配置