精华内容
下载资源
问答
  • Python成绩管理系统

    千次阅读 2020-06-11 09:44:22
    系统是基于Python语言,通过对成绩管理工作的日常分析,确定了具体的研究目标以及业务功能。采用了结构化的设计方法设计了一个简单的框架,通过编程实现了对成绩信息的添加、修改、删除、查询,并且使用csv文件...

    摘要

    随着科学技术的不断发展,应用计算机技术来实现对学生成绩的管理成为目前学校的主要手段。随着科技的日新月异,程序的简单化的广泛化成为了目前程序的重要性。
    本系统是基于Python语言,通过对成绩管理工作的日常分析,确定了具体的研究目标以及业务功能。采用了结构化的设计方法设计了一个简单的框架,通过编程实现了对成绩信息的添加、修改、删除、查询,并且使用csv文件作为存储信息。

    1.引言

    1.1 背景

    由于本学期开设了python课,同时也开设了软件工程的课。于是我与另外的两名同学组队以python语言为主体的,结合数据库知识,一起做了一个航空管理系统。
    又由于现在python期末作业也需要每人做一个项目,正好我在软件工程项目中,我负责是做界面的部分,所以我自己又用python做了现在的这个成绩管理系统出来。

    1.2 意义

    做这个系统不仅锻炼了我的编程能力,还让我对python的理解更加了一层楼。懂得了python的强大地方除了它的简便和灵活外,还有的就是它提供了很多模块供我们使用,这让我们的学习兴趣能不断加强。

    1.3 相关研究

    成绩管理系统是使用计算机软件系统管理成绩的一种方式。目前国内基本所有的学校都已经实现了使用计算机软件来管理成绩的智能化管理。但一个简便的软件,方便好用成为了如今成绩管理系统的趋势,传统的成绩管理系统界面复杂操作困难,不适合任何人包括计算机小白的使用。

    2. 系统结构

    该系统主要有三个结构组成:登录页面、主页面、信息保存

    两个页面都是使用python中的Tkinter库来创造,Tkinter库(模块)是Python的标准Tk GUI 工具包的接口。Tkinter可以在大多数的Unix和Windows平台下使用。TK8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
    由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。
    Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。

    信息保存是使用了csv文件来保存,该种文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分割符是其它字符或字符串,最常见的是逗号或制表符

    CSV没有通用标准规范。不同的程序间CSV的标准有差异很常见,这可能导致交互操作困难。互联网通信的CSV文件,资料的IETF文件( 符合RFC 4180于2005年10月)介绍了格式的“text/csv格式”MIME类型登记的IANA负责。另一个相关的规格是由派出文字其中也包括CSV格式。
    成绩管理系统服务功能结构图
    3. 实现代码
    3.1 登陆界面
    首先创造的是主函数。主函数里面引入了tkinter库和登陆界面的类,创建了一个tkinter对象root,并且给它设置了标题,然后将root作为参数给LoginPage这个类

    1.	from tkinter import *    
    2.	from LoginPage import *    
    3.	
    4.	    
    5.	root = Tk()    
    6.	root.title('Python成绩管理系统by Joe Lau')    
    7.	LoginPage(root)    
    8.	root.mainloop() 
    
    

    接下来是登录界面的代码。登陆界面是创造了一个LoginPage的类,在类的构造函数里面设置好框的大小,然后调用createPage函数创造各个tkinter的部件。再利用register函数来执行注册操作,loginCheck函数来实现登录

    1.	from tkinter import *    
    2.	from tkinter.messagebox import *    
    3.	from MainPage import *    
    4.	    
    5.	class LoginPage(object):    
    6.	    def __init__(self, master=None):    
    7.	        self.root = master #定义内部变量root    
    8.	        self.root.geometry('%dx%d' % (300, 200)) #设置窗口大小    
    9.	        self.username = StringVar()    
    10.	        self.password = StringVar()    
    11.	        self.createPage()    
    12.	    
    13.	    def createPage(self):  
    14.	        self.page = Frame(self.root) #创建Frame    
    15.	        self.page.pack()    
    16.	        Label(self.page).grid(row=0, stick=W)    
    17.	        Label(self.page, text = '账户: ').grid(row=1, stick=W, pady=10)    
    18.	        Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E)    
    19.	        Label(self.page, text = '密码: ').grid(row=2, stick=W, pady=10)    
    20.	        Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E)    
    21.	        Button(self.page, text='登陆', command=self.loginCheck).grid(row=3, column=0, pady=5)  
    22.	        Button(self.page, text='注册', command=self.register).grid(row=3, column=1, pady=5)    
    23.	        Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=2, pady=5)  
    24.	          
    25.	    
    26.	    def loginCheck(self):    
    27.	        name = self.username.get()    
    28.	        password = self.password.get()  
    29.	        if self.isLegalUser(name,password):  
    30.	            self.page.destroy()    
    31.	            MainPage(self.root)#进入主界面    
    32.	        else:    
    33.	            showinfo(title='错误', message='账号或密码错误!')  
    34.	              
    35.	    def isLegal(self,string):  
    36.	        alp = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9']  
    37.	        for i in string:  
    38.	            if i in alp:  
    39.	                pass  
    40.	            else:  
    41.	                return False  
    42.	        return True  
    43.	          
    44.	    def isLegalUser(self,name,password):#验证账号  
    45.	        f = open('账号密码.csv','r',encoding='utf-8')#打开csv文件,是用csv文件来存储账号密码信息  
    46.	        for line in f.readlines():#读出每一行  
    47.	            info = line[:-1].split(",")#获取账号和密码  
    48.	            if len(info)<2:#错误  
    49.	                break  
    50.	            if info[0].strip()==name and  info[1].strip()==password :#如果获取到的账号和密码复合输入的情况  
    51.	                 f.close()#关闭文件  
    52.	                 return True  
    53.	        return False  
    54.	  
    55.	                  
    56.	    def register(self):  
    57.	        name = self.username.get()    
    58.	        password = self.password.get()  
    59.	        if len(name)==0 or len(password)==0:  
    60.	            showinfo(title='错误', message='账号密码不能为空')  
    61.	            return  
    62.	        for i in password:  
    63.	            if i is ',' or i is ' ':  
    64.	                showinfo(title='错误', message='密码不能含有非法字符')  
    65.	                return  
    66.	        if self.isLegal(name):  
    67.	            pass  
    68.	        else:  
    69.	            showinfo(title='错误', message='账号不能含有非法字符')  
    70.	            return  
    71.	          
    72.	        f = open('账号密码.csv','r',encoding='utf-8')  
    73.	        for line in f.readlines():  
    74.	            info = line[:-1].split(",")  
    75.	            if len(info)<2:  
    76.	                break  
    77.	            if info[0].strip()==name:  
    78.	                 messagebox.showinfo(title='结果', message ="已存在该用户信息!")  
    79.	                 f.close()  
    80.	                 return  
    81.	        f.close()  
    82.	          
    83.	        f = open('账号密码.csv','a',encoding='utf-8')  
    84.	        f.write('{},{}\n'.format(name,password))  
    85.	        f.close()  
    86.	        messagebox.showinfo(title='提示', message ="注册成功")  
    
    

    3.2 主界面
    主界面也是创造了一个类,然后创建了4个函数inputData、deleteData、modifyData、queryData。四个函数分别创建了不同tkinter独有的框架Frame,Frame里面以在主函数创造的tkinter变量tk为上层,逐步的创造每个功能所特有的画面。
    四个不同的函数在view.py中以不同的类而实现,调用那四个函数实际上也是调用了view.py上面所创造的四个不同的类。

    1.	from tkinter import *    
    2.	from view import *  #菜单栏对应的各个子页面    
    3.	    
    4.	class MainPage(object):    
    5.	    def __init__(self, master=None):    
    6.	        self.root = master #定义内部变量root    
    7.	        self.root.geometry('%dx%d' % (600, 400)) #设置窗口大小    
    8.	        self.createPage()    
    9.	    
    10.	    def createPage(self):    
    11.	        self.inputPage = InputFrame(self.root) # 创建不同Frame    
    12.	        self.deletePage = DeleteFrame(self.root)  
    13.	        self.modifyPage = ModifyFrame(self.root)  
    14.	        self.queryPage = QueryFrame(self.root)   
    15.	        self.inputPage.pack() #默认显示数据录入界面    
    16.	        menubar = Menu(self.root)    
    17.	        menubar.add_command(label='增加信息', command = self.inputData)    
    18.	        menubar.add_command(label='删除信息', command = self.deleteData)    
    19.	        menubar.add_command(label='修改信息', command = self.modifyData)    
    20.	        menubar.add_command(label='查询信息', command = self.queryData)    
    21.	        self.root['menu'] = menubar  # 设置菜单栏    
    22.	    
    23.	    def inputData(self):    
    24.	        self.inputPage.pack()    
    25.	        self.queryPage.pack_forget()    
    26.	        self.deletePage.pack_forget()  
    27.	        self.modifyPage.pack_forget()   
    28.	  
    29.	    def deleteData(self):    
    30.	        self.inputPage.pack_forget()    
    31.	        self.queryPage.pack_forget()    
    32.	        self.deletePage.pack()    
    33.	        self.modifyPage.pack_forget()  
    34.	  
    35.	    def modifyData(self):    
    36.	        self.inputPage.pack_forget()    
    37.	        self.queryPage.pack_forget()    
    38.	        self.deletePage.pack_forget()    
    39.	        self.modifyPage.pack()           
    40.	          
    41.	    def queryData(self):    
    42.	        self.inputPage.pack_forget()    
    43.	        self.queryPage.pack()    
    44.	        self.deletePage.pack_forget()    
    45.	        self.modifyPage.pack_forget()    
    46.	    
    47.	    
    48.	    
    1.	     from tkinter import *    
    2.	from tkinter.messagebox import *    
    3.	    
    4.	class InputFrame(Frame): # 继承Frame类    
    5.	    def __init__(self, master=None):    
    6.	        Frame.__init__(self, master)    
    7.	        self.root = master #定义内部变量root    
    8.	        self.E1 = Entry(self)  
    9.	        self.E2 = Entry(self)  
    10.	        self.E3 = Entry(self)  
    11.	        self.E4 = Entry(self)  
    12.	        self.E5 = Entry(self)  
    13.	        self.E6 = Entry(self)  
    14.	        self.createPage()    
    15.	  
    16.	    def Isspace(self,text):  
    17.	        temp = 0  
    18.	        for i in text:  
    19.	           if not i.isspace():  
    20.	               temp = 1  
    21.	               break;  
    22.	  
    23.	        if temp==1:  
    24.	            return 0  
    25.	        else:  
    26.	            return 1  
    27.	  
    28.	  
    29.	    def write(self,name,num,course,score):  
    30.	        f = open('成绩.csv','r',encoding='utf-8')  
    31.	        for line in f.readlines():  
    32.	            info = line[:-1].split(",")  
    33.	            if len(info)<4:  
    34.	                break  
    35.	            if info[1] ==num and info[2] ==course:  
    36.	                 messagebox.showinfo(title='结果', message ="已存在该学生科目信息!")  
    37.	                 f.close()  
    38.	                 return  
    39.	  
    40.	        f.close()  
    41.	        f = open('成绩.csv','a',encoding='utf-8')  
    42.	        f.write('{},{},{},{}\n'.format(name,num,course,score))  
    43.	        f.close()  
    44.	        messagebox.showinfo(title='提示', message ="写入成功")  
    45.	        return  
    46.	      
    47.	    def click(self):  
    48.	        name = self.E1.get()  
    49.	        num = self.E2.get()  
    50.	        course = self.E3.get()  
    51.	        score = self.E4.get()  
    52.	        if self.Isspace(name) or self.Isspace(num) or self.Isspace(course) or self.Isspace(score) :  
    53.	            messagebox.showinfo(title='提示', message ="输入项为空")  
    54.	        else:  
    55.	            self.write(name,num,course,score)  
    56.	              
    57.	          
    58.	          
    59.	    def createPage(self):    
    60.	        Label(self).grid(row=0, stick=W, pady=10)  
    61.	          
    62.	        Label(self, text = '姓名: ').grid(row=1, stick=W, pady=10)  
    63.	        self.E1.grid(row=1, column=1, stick=E)  
    64.	  
    65.	        Label(self, text = '学号: ').grid(row=2, stick=W, pady=10)  
    66.	        self.E2.grid(row=2, column=1, stick=E)  
    67.	  
    68.	        Label(self, text = '科目: ').grid(row=3, stick=W, pady=10)   
    69.	        self.E3.grid(row=3, column=1, stick=E)   
    70.	  
    71.	        Label(self, text = '成绩: ').grid(row=4, stick=W, pady=10)  
    72.	        self.E4.grid(row=4, column=1, stick=E)         
    73.	          
    74.	        Button(self, text='录入',command=self.click).grid(row=6, column=1, stick=E, pady=10)    
    75.	    
    76.	    
    77.	class DeleteFrame(Frame): # 继承Frame类    
    78.	    def __init__(self, master=None):    
    79.	        Frame.__init__(self, master)    
    80.	        self.root = master #定义内部变量root  
    81.	        self.E1 = Entry(self)  
    82.	        self.E2 = Entry(self)  
    83.	        self.createPage()  
    84.	          
    85.	    def Isspace(self,text):  
    86.	        temp = 0  
    87.	        for i in text:  
    88.	           if not i.isspace():  
    89.	               temp = 1  
    90.	               break;  
    91.	  
    92.	        if temp==1:  
    93.	            return 0  
    94.	        else:  
    95.	            return 1  
    96.	  
    97.	    def delete(self,num,course):  
    98.	        temp = 0  
    99.	        with open("成绩.csv","r",encoding="utf-8") as f:  
    100.	            lines = f.readlines()  
    101.	     
    102.	        with open("成绩.csv","w",encoding="utf-8") as f_w:  
    103.	            for line in lines:  
    104.	                info = line[:-1].split(",")  
    105.	                if info[1] ==num and info[2] ==course:  
    106.	                    temp = 1  
    107.	                    continue  
    108.	                f_w.write(line)  
    109.	        if temp==0:  
    110.	            messagebox.showinfo(title='提示', message ="没有该信息")  
    111.	        else:  
    112.	            messagebox.showinfo(title='提示', message ="删除成功")  
    113.	          
    114.	    def click(self):  
    115.	        num = self.E1.get()  
    116.	        course = self.E2.get()  
    117.	        if self.Isspace(num) or self.Isspace(course):  
    118.	            messagebox.showinfo(title='提示', message ="输入项为空")  
    119.	        else:  
    120.	            self.delete(num,course)  
    121.	              
    122.	    def createPage(self):  
    123.	        Label(self).grid(row=0, stick=W, pady=10)  
    124.	          
    125.	        Label(self, text = '学号: ').grid(row=1, stick=W, pady=10)  
    126.	        self.E1.grid(row=1, column=1, stick=E)  
    127.	  
    128.	        Label(self, text = '科目: ').grid(row=2, stick=W, pady=10)  
    129.	        self.E2.grid(row=2, column=1, stick=E)  
    130.	  
    131.	        Button(self, text='删除',command=self.click).grid(row=6, column=1, stick=E, pady=10)    
    132.	    
    133.	    
    134.	class ModifyFrame(Frame): # 继承Frame类    
    135.	    def __init__(self, master=None):    
    136.	        Frame.__init__(self, master)    
    137.	        self.root = master #定义内部变量root    
    138.	        self.E1 = Entry(self)  
    139.	        self.E2 = Entry(self)  
    140.	        self.E3 = Entry(self)  
    141.	        self.E4 = Entry(self)  
    142.	        self.E5 = Entry(self)  
    143.	        self.createPage()    
    144.	  
    145.	    def Isspace(self,text):  
    146.	        temp = 0  
    147.	        for i in text:  
    148.	           if not i.isspace():  
    149.	               temp = 1  
    150.	               break;  
    151.	  
    152.	        if temp==1:  
    153.	            return 0  
    154.	        else:  
    155.	            return 1  
    156.	  
    157.	          
    158.	    def modify(self,name,num,course,score):  
    159.	        temp = 0  
    160.	        with open("成绩.csv","r",encoding="utf-8") as f:  
    161.	            lines = f.readlines()  
    162.	     
    163.	        with open("成绩.csv","w",encoding="utf-8") as f_w:  
    164.	            for line in lines:  
    165.	                info = line[:-1].split(",")  
    166.	                if info[1] ==num and info[2] ==course:  
    167.	                    temp = 1  
    168.	                    f_w.write('{},{},{},{}\n'.format(name,num,course,score))  
    169.	                    continue  
    170.	                f_w.write(line)  
    171.	        if temp==0:  
    172.	            messagebox.showinfo(title='提示', message ="没有该信息")  
    173.	        else:  
    174.	            messagebox.showinfo(title='提示', message ="修改成功")  
    175.	          
    176.	    def click(self):  
    177.	        name = self.E1.get()  
    178.	        num = self.E2.get()  
    179.	        course = self.E3.get()  
    180.	        score = self.E4.get()  
    181.	        if self.Isspace(name) or self.Isspace(num) or self.Isspace(course) or self.Isspace(score) :  
    182.	            messagebox.showinfo(title='提示', message ="输入项为空")  
    183.	        else:  
    184.	            self.modify(name,num,course,score)  
    185.	          
    186.	          
    187.	    def createPage(self):    
    188.	        Label(self).grid(row=0, stick=W, pady=10)  
    189.	        Label(self, text = '姓名: ').grid(row=1, stick=W, pady=10)  
    190.	        self.E1.grid(row=1, column=1, stick=E)  
    191.	  
    192.	        Label(self, text = '学号: ').grid(row=2, stick=W, pady=10)  
    193.	        self.E2.grid(row=2, column=1, stick=E)  
    194.	  
    195.	        Label(self, text = '科目: ').grid(row=3, stick=W, pady=10)   
    196.	        self.E3.grid(row=3, column=1, stick=E)   
    197.	  
    198.	        Label(self, text = '成绩: ').grid(row=4, stick=W, pady=10)  
    199.	        self.E4.grid(row=4, column=1, stick=E)         
    200.	          
    201.	        Button(self, text='修改',command=self.click).grid(row=6, column=1, stick=E, pady=10)    
    202.	  
    203.	class QueryFrame(Frame): # 继承Frame类    
    204.	    def __init__(self, master=None):    
    205.	        Frame.__init__(self, master)    
    206.	        self.root = master #定义内部变量root  
    207.	        self.E1 = Entry(self)  
    208.	        self.E2 = Entry(self)  
    209.	        self.createPage()    
    210.	  
    211.	    def Isspace(self,text):  
    212.	        temp = 0  
    213.	        for i in text:  
    214.	           if not i.isspace():  
    215.	               temp = 1  
    216.	               break;  
    217.	  
    218.	        if temp==1:  
    219.	            return 0  
    220.	        else:  
    221.	            return 1  
    222.	  
    223.	    def query(self,num,course):  
    224.	        f = open('成绩.csv','r',encoding='utf-8')  
    225.	        for line in f.readlines():  
    226.	            info = line[:-1].split(",")  
    227.	            if info[1] ==num and info[2] ==course:  
    228.	                 messagebox.showinfo(title='结果', message ="姓名:"+info[0] +"\n学号:"+info[1] +"\n科目:"+info[2] +"\n成绩:"+info[3] )  
    229.	                 f.close()  
    230.	                 return  
    231.	  
    232.	        messagebox.showinfo(title='提示', message ="没有该信息")  
    233.	        f.close()  
    234.	        return          
    235.	          
    236.	          
    237.	    def click(self):  
    238.	        num = self.E1.get()  
    239.	        course = self.E2.get()  
    240.	        if self.Isspace(num) or self.Isspace(course):  
    241.	            messagebox.showinfo(title='提示', message ="输入项为空")  
    242.	        else:  
    243.	            self.query(num,course)  
    244.	              
    245.	              
    246.	    def createPage(self):  
    247.	        Label(self).grid(row=0, stick=W, pady=10)  
    248.	          
    249.	        Label(self, text = '学号: ').grid(row=1, stick=W, pady=10)  
    250.	        self.E1.grid(row=1, column=1, stick=E)  
    251.	  
    252.	        Label(self, text = '科目: ').grid(row=2, stick=W, pady=10)  
    253.	        self.E2.grid(row=2, column=1, stick=E)  
    254.	  
    255.	        Button(self, text='查找',command=self.click).grid(row=6, column=1, stick=E, pady=10)    
    
    
    1. 实验结果
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2. 总结与展望
      由于在软件工程小组中,我是负责写界面的人,同时也是小组的组长,所以在这次python语言程序设计课程的个人项目当中,我发现了自己一个人的力量是远远不够众人的力量,所以很多东西都是需要团队的支持下才能成功。
      这次的成绩管理系统不仅增强了我的编程能力,同时也让我对python学习程度上的一个总结。可惜自己在小组中并不是负责数据库这一方面,否则也可以增上数据库的内容,而不是使用简单的csv文件来存储数据,虽然这样方便操作,但是可能走以后使用成绩管理系统的过程中,难免会出现bug,可能还存在一些后期的使用才能发现的错误。
      希望在以后的学习中,能使用python将数据库接口学习一下,这样就可以使用数据库来存储数据了,比较方便可靠。

    展开全文
  • Python成绩管理系统:1、包括增、删、改、查 2、拥有简易UI界面 3、数据使用CSV文件存储 4、不包含数据库
  • Python成绩管理系统3

    2020-05-26 20:37:19
    Python成绩管理系统3 哎,前几天发的管理系统,我总是感觉功能没那么的实际,于是我就再改了一哈!希望你们不要烦哈 ! 我就再加了一个增删改的功能,现在我感觉应该还行! def Welcome(): print("欢迎使用成绩管理系统...

    Python成绩管理系统3

    哎,前几天发的管理系统,我总是感觉功能没那么的实际,于是我就再改了一哈!希望你们不要烦哈 !

    我就再加了一个增删改的功能,现在我感觉应该还行!

    def Welcome():
        print("欢迎使用成绩管理系统!")
        print("在这里你可以查看同学的成绩!")
    def firstmune():
        print("1.增加同学信息")
        print("2.删减同学信息")
        print("3.修改同学信息")
        print("4.查询同学信息")
        print("5.退出")
    def message():
        print("1.语文")
        print("2.数学")
        print("3.英语")
    def mune1():
        print("1.显示数据")
        print("2.查询成绩")
        print("3.退出")
    def mune2():
        print("1.语文")
        print("2.数学")
        print("3.英语")
        print("4.总分")
        print("5.平均分")
        print("6.总分排名")
        print("7.退出")
    def mune3():
        print("1.成绩")
        print("2.排名")
        print("3.成绩和排名")
        print("4.退出")
    def GetData():
        sum = []
        f = open('D:/score.txt')
        list = f.readlines()
        for i in list[1:]:
            if not i.isspace():
                i = i.strip('\n')
                i = i.split()
                sum.append(i)
        return sum
    def Sumgrades(sum):
        for i in sum:
            i.append(int(i[2])+int(i[3])+int(i[4]))
        return sum
    def sort(sum):
        grades=[]
        for i in sum:
            grades.append(int(i[5]))
        grades.sort(reverse = True)
        for j in range(len(sum)):
                x = grades.index(int(sum[j][5]))
                sum[j].append(x+1)
        return sum
    def ChineseSort(sum):
        grades = []
        for i in sum:
            grades.append(int(i[2]))
        grades.sort(reverse=True)
        for j in range(len(sum)):
            x = grades.index(int(sum[j][2]))
            sum[j].append(x+1)
    def MathSort(sum):
        grades = []
        for i in sum:
            grades.append(int(i[3]))
        grades.sort(reverse=True)
        for j in range(len(sum)):
            x = grades.index(int(sum[j][3]))
            sum[j].append(x+1)
    def EnglishSort(sum):
        grades = []
        for i in sum:
            grades.append(int(i[4]))
        grades.sort(reverse=True)
        for j in range(len(sum)):
            x = grades.index(int(sum[j][4]))
            sum[j].append(x+1)
    def Ranking(sum):
        grades = []
        newgrades = []
        for i in sum:
            grades.append(i[5])
        grades.sort(reverse=True)
        for i in range(len(sum)):
            for j in range(len(grades)):
                if sum[j][5] == grades[i]:
                    newgrades.append(sum[j])
                    break
        return newgrades
    def AddStudent(sum,list):
        sum.append(list)
    def ReduceStudent(sum,str):
        for i in sum:
            if str == i[1] or str == i[0]:
                sum.remove(i)
                break
    def Revise(sum,str,n):
        for i in sum:
            if str == i[1] or str == i[0]:
                y = eval(input("输入改入的成绩:"))
                i[n+1] = y
    Welcome()
    sum1=GetData()
    while 1:
        firstmune()
        x = eval(input("请输入您想执行的功能:"))
        if x == 1:
            x = input("请输入同学信息(以空格隔开):")
            x = x.strip('\n')
            x = x.split()
            AddStudent(sum1,x)
        elif x == 2:
            x = input("请输入学号或者姓名:")
            ReduceStudent(sum1,x)
        elif x == 3:
            x = input("请输入学号或者姓名:")
            print("请输入您想修改的项目")
            message()
            y = eval(input("请输入:"))
            Revise(sum1,x,y)
        elif x == 4:
            sum = Sumgrades(sum1)
            sum = Ranking(sum)
            sum = sort(sum)
            ChineseSort(sum)
            MathSort(sum)
            EnglishSort(sum)
            Ranking(sum)
            while 1:
                mune1()
                x = eval(input("请输入:"))
                if x==1:
                    print("{}   {}    {}   {}   {}   {}  ".format('姓名', '学号', '语文', '数学', '英语', '总分'))
                    for i in sum:
                        print("{}  {}  {}    {}    {}    {}    ".format(i[0],i[1],i[2],i[3],i[4],i[5]))
                elif x == 2:
                    while 1:
                        mune2()
                        x = eval(input("请输入:"))
                        if x == 1:
                            x1 = input("输入学号或者姓名:")
                            while 1:
                                mune3()
                                x = eval(input("请输入选项:"))
                                for i in sum:
                                    if i[0] == x1 or i[1] == x1:
                                        if x == 1:
                                            print("{}".format(i[2]))
                                            print("加油,相信自己!")
                                        elif x == 2:
                                            print("{}".format(i[7]))
                                        elif x == 3:
                                            print("成绩为:{}   排名:第{}名".format(i[3], i[8]))
                                        elif x != 4:
                                            print("输入错误,请重新输入!")
                                        elif x == 4:
                                            continue
                                break
                        elif x == 2:
                            x1 = input("输入学号或者姓名:")
                            while 1:
                                mune3()
                                x = eval(input("请输入选项"))
                                for i in sum:
                                    if i[0] == x1 or i[1] == x1:
                                        if x == 1:
                                            print("{}".format(i[3]))
                                            print("加油,相信自己!")
                                        elif x == 2:
                                            print("{}".format(i[8]))
                                        elif x == 3:
                                            print("成绩为:{}   排名:第{}名".format(i[3],i[8]))
                                        elif x != 4:
                                            print("输入错误,请重新输入!")
                                        elif x == 4:
                                            continue
                                break
                        elif x == 3:
                            x1 = input("输入学号或者姓名:")
                            while 1:
                                mune3()
                                x = eval(input("请输入选项:"))
                                for i in sum:
                                    if i[0] == x1 or i[1] == x1:
                                        if x == 1:
                                            print("{}".format(i[4]))
                                            print("加油,相信自己!")
                                        elif x == 2:
                                            print("{}".format(i[9]))
                                        elif x == 3:
                                            print("成绩为:{}   排名:第{}名".format(i[3],i[8]))
                                        elif x!=4:
                                            print("输入错误,请重新输入!")
                                        elif x == 4:
                                            continue
                                break
                        elif x == 4:
                            x1 = input("输入学号或者姓名:")
                            for i in sum:
                                if i[0] == x1 or i[1] == x1:
                                    print("{}".format(i[5]))
                                    print("加油,相信自己!")
                        elif x == 5:
                            score = 0
                            x1 = input("输入学号或者姓名!")
                            for i in sum:
                                if i[0] == x1 or i[1] == x1:
                                    score=(int(i[2])+int(i[3])+int(i[4]))/3
                                    print("{:.2f}".format(score))
                                    print("加油,相信自己!")
                        elif x == 6:
                            x1 = input("输入学号或者姓名!")
                            for i in sum:
                                if i[0] == x1 or i[1] == x1:
                                    print("{}".format(i[6]))
                                    print("加油,相信自己!")
                        elif x == 7:
                            break
                        else:
                            print("您输入的数字识别不了,请重新输入啊!")
                elif x == 3:
                    break
                else:
                    print("您输入的数字识别不了,请重新输入啊!")
        elif x == 5:
            break
        else:
            print("您输入有错误,请重新输入!")
    
    
    展开全文
  • Python成绩管理系统:1、包括增、删、改、查 2、拥有简易UI界面 3、数据使用CSV文件存储 4、不包含数据库,5适合大学生上完这个课程制作,6适合做课程设计
  • python成绩管理系统-数据库版本 说明:本系统功能是利用python来编写代码,同时利用数据库 二级标题 三级标题 #基于学生成绩管理系统,使用本地数据库和之前的成绩管理系统代码进行整编,有用户管理功能,带有日志,...

    python成绩管理系统-数据库版本

    *说明:本系统功能是利用python来编写代码,同时利用数据库文件相关功能,来实现数据库成绩管理系统。同时提供其他两个版本的数据库版本的成绩管理系统来提供借鉴,仅供参考,切勿抄袭。

    第一个版本(本地数据库化带日志文件):

    #基于学生成绩管理系统,使用本地数据库和之前的成绩管理系统代码进行整编,有用户管理功能,带有日志,及相关数据库文件生成
    #作者:xxx  本地数据库,因为VM虚拟机搭建WEB站点动态IP及NAT限制,为使其他人能访问,使用本地数据库
    #一些功能模块参考一些优秀的GitHub的第三方作者,理解优秀代码其中的含义,根据实际要求,并最终写出相应的功能,并要感谢优秀的GitHub的作者
    import logging
    import hashlib
    import shelve
    #引入并定义学生类
    class student():
        def __init__(self,id,ch,ma,en):
            self.id=id
            self.ch=ch
            self.ma=ma
            self.en=en
        def __str__(self):
            return f"学号:{self.id}\n总分:{self.total()}\n"
        def total(self):
            return self.ch+self.ma+self.en
        def pm(self,alist):
            return len(list(filter(lambda i:i.total()>self.total(),alist)))+1
            
    #定义全局变量默认值
    user=''
    datas=[]
    accouts={"admin":{"pwd":"21232f297a57a5a743894a0e4a801fc3","role":"1234567890"},"zhangsan":{"pwd":"e10adc3949ba59abbe56e057f20f883e","role":"12360"},"1":{"pwd":"c4ca4238a0b923820dcc509a6f75849b","role":"1234567890"}}
    funcdic=["-----------------本程序为广东石油化工学院电子信息工程专业学生成绩管理系统,请选择系统功能:---------------------\n",
        "                 1.增加学生信息;\n",
        "                 2.修改学生的相关信息;\n",
        "                 3.删除学生的相关信息;\n",
        "                 4.查询学生信息;\n",
        "                 5.学生成绩分类统计;\n",
        "                 6.学生成绩排序;\n",
        "                 7.显示所有学生的信息;\n",
        "                 8.用户管理;\n",
        "                 0.退出程序;\n"]
    subjectdic={"语文":0,"数学":1,"英语":2}#定义字典
    logging.basicConfig(level= logging.DEBUG,
                        filename = "xxgl.log",
                        format   = "%(asctime)s  %(filename)s : %(levelname)s  %(message)s",
                        datefmt  = "%Y-%m-%d %H:%M:%S",
                        filemode = "a")
                        
    #数据库初始化,并输入带数据库的数据
    def init():#此模块可将已有数据库进行合一处理
        global datas,accouts
        with shelve.open("mydb") as f:
            try:
                datas=f["data"]
                accouts=f["user"]
                logging.info("从数据库读入信息成功!")
            except:
                f["data"]=datas
                f["user"]=accouts
                logging.warning("数据库恢复到初始值!")
    #用户登录
    def login():
        global user
        uname=input("请输入用户名:")
        passwd=input("请输入密码:")
        password=hashlib.md5(passwd.encode()).hexdigest()
        if uname in accouts:
            if password==accouts[uname]["pwd"]:
                logging.info(f"用户{uname}登录成功!")
                user=uname
                return
        print("用户名或密码错!")
        logging.warning(f"用户{uname}登录失败!")
    #信息保存
    def save():
        with shelve.open("mydb") as f:#打开相关数据库文件,进行统一处理
            f["data"]=datas
            f["user"]=accouts
    #打印学生信息表
    def printdata(f,title):
        table=sorted(datas,key=f)
        print(f"{title:-^70s}")
        print(f'{"学号":^10s}{"语文":^10s}{"数学":^10s}{"英语":^10s}{"总分":^10s}{"名次":^10s}')
        print("-"*75)
        for i in table:     
            print(f'{i.id:^12s}{i.ch:^12d}{i.ma:^12d}{i.en:^12d}{i.total():^12d}{i.pm(datas):^12d}')
        print("-"*75)
        logging.info(f"{user}打印了{title}!")
    #增加学生信息
    def add1():
        print("添加学生成绩::".center(65,'-'))
        global datas
        
        b=[i.id for i in datas]
        while 1:
            id=input("请输入学号:").strip()
            if id not in b:
                break
            print('该生信息已存在,请重新输入!')
        ch=int(input("语文:").strip())
        ma=int(input("数学:").strip())
        en=int(input("英语:").strip())
        datas.append(student(id,ch,ma,en))
        save()
        logging.info(f"{user}增加了一条学生记录,学号{id}。")
    #成绩汇总及各科统计
    def datafx():
        ch=[i.ch for i in datas]
        ma=[i.ma for i in datas]
        en=[i.en for i in datas]
        print("语文成绩统计".center(50,"-"))
        print(f"平均分:{sum(ch)/len(ch):40.2f}")
        print(f"及格率:{100*sum([i>=60 for i in ch])/len(ch):40.2f}%")
        print(f"优秀率:{100*sum([i>=80 for i in ch])/len(ch):40.2f}%\n")
        print("数学成绩统计".center(50,"-"))
        print(f"平均分:{sum(ma)/len(ma):40.2f}")
        print(f"及格率:{100*sum([i>=60 for i in ma])/len(ma):40.2f}%")
        print(f"优秀率:{100*sum([i>=80 for i in ma])/len(ma):40.2f}%\n")
        print("英语成绩统计".center(50,"-"))
        print(f"平均分:{sum(en)/len(en):40.2f}")
        print(f"及格率:{100*sum([i>=60 for i in en])/len(en):40.2f}%")
        print(f"优秀率:{100*sum([i>=80 for i in en])/len(en):40.2f}%\n")
        logging.info(f"{user}查看了成绩分析。")
    #查看学员成绩
    def query():
        print("查看学生成绩:".center(65,'-'))
        b=[i.id for i in datas]
        while 1:
            id=input("请输入学号:")
            if id in b:
                break
            print('该生信息不存在,请重新输入!')
        a=list(filter(lambda i:i.id==id,datas))[0]   
        print(f"语文成绩:{a.ch}")
        print(f"数学成绩:{a.ma}")
        print(f"英语成绩:{a.en}\n")
        logging.info(f"{user}查看了学生{id}的成绩。")
    #修改学生成绩
    def update1():
        print("修改学生成绩:".center(65,'-'))
        b=[i.id for i in datas]
        while 1:
            id=input("请输入该学生学号:")
            if id in b:
                break
            print('该生信息不存在,请重新输入!')
        a=list(filter(lambda i:i.id==id,datas))[0]    
        s1=int(input("语文成绩:"))
        s2=int(input("数学成绩:"))
        s3=int(input("英语成绩:"))
        a.ch=s1
        a.ma=s2
        a.en=s3
        save()
        print('修改成功')
        logging.info(f"{user}修改了学生{id}的成绩。")
    #删除学生信息
    def delete():
        print("删除学生信息:".center(65,'-'))
        global datas#全局变量声明
        b=[i.id for i in datas]
        while 1:
            id=input("请输入学号:")
            if id in b:
                break
            print('该生信息不存在,请重新输入!')
        a=list(filter(lambda i:i.id!=id,datas))
        datas=a
        save()
        logging.info(f"{user}删除了该学生{id}。")
    #用户管理
    def manage():
        global accouts
        print("功能列表:")
        while 1:
            while 1:
                print("用户管理功能".center(70,'-'))
                op=input("1增加用户 2删除用户 3修改密码 4查询用户  5退出 \n").strip()
                if op in list("12345"):
                    break
                print("输入有误!")
            if op=="1":    #添加用户
                print(f"{'添加用户':-^60s}")
                uname=input("用户名:").strip()
                pd=input("密码:").strip()
                pd=hashlib.md5(pd.encode()).hexdigest()
                ro=input("权限:").strip()
                if uname in accouts:
                    print("用户已存在!")
                else:
                    accouts[uname]={"pwd":pd,"role":ro}
                    logging.warning(f"{user}新建了账户{uname}!")
                    save()
            elif op=="2":    #删除账户
                print(f"{'删除账户':-^60s}")
                uname=input("用户名:").strip()
                if uname in accouts:
                    del accouts[uname]
                    save()
                    logging.warning(f"{user}删除了账户{uname}!")
                else:
                    print("该学生用户名不存在!")
            elif op=="3":    #修改密码权限
                print(f"{'修改密码权限':-^60s}")
                while 1:
                    uname=input("请输入用户名").strip()
                    if uname not in accouts:
                        print('您输入的用户不存在,请重新输入')
                    else: 
                        break
                pwd1=input("新密码:")
                pwd2=input("确认密码:")            
                if pwd1==pwd2:
                    pd=hashlib.md5(pwd1.encode()).hexdigest()
                    accouts[uname]["pwd"]=pd
                    save()
                    logging.warning(f"{user}修改了{uname}账户密码!")
                else:
                    print("两次密码不一致!")
                quanxian=input("请输入权限:")
                accouts[uname]['role']=quanxian
                save()
                logging.warning(f"{user}修改了{uname}账户权限!")
            elif op=="4":   #查询用户信息
                print(f"{'查询用户信息':-^60s}")
                print(f"{'用户名':^10s}{'密码':^35s}{'权限':^10s}")
                for k,v in accouts.items():
                    print(f"{k:^13s}{v['pwd']:^37s}{v['role']:^12s}")
                print()
                logging.warning(f"{user}查询了账户信息!")
            else:
                break
    while 1:
        init()
        login()
        if user in accouts:
            role=accouts[user]["role"]                
            print("欢迎使用广东石油化工学院电子信息工程学院成绩管理系统".center(60,"-"))
            print("作者:xxx   初始化数据库版本\n".center(65))
            while 1:
                print("功能列表:")
                for i in range(10):
                    print(funcdic[i])
                while 1:
                    select=input("你的选择是:").strip()
                    if select in role:
                        break
                    print("输入有误,请选择功能编号!")
                if select=="1":        #增加学生信息,
                    add1()
                elif select=="2":        #修改学生信息
                    update1()
                elif select=="3":        #删除学生信息
                    delete()
                elif select=="4":        #查询学生信息
                    query()
                elif select=="5":        #成绩汇总显示及各类统计
                    datafx()
                elif select=="6":        # 成绩排序
                    printdata(lambda i:i.pm(datas),"广油电信学院成绩排名表")
                elif select=="7":          #所有成绩显示
                    printdata(lambda i:i.id,"广东石油化工学院电子信息工程学院学生成绩单")
                elif select=="8":        #用户管理功能
                    manage()
                elif select=="0":
                    break
                else:
                    logging.info(f"{user}退出了系统。")
                    exit()
    
    
    
    

    第二个版本(带图形化页面的):

    """
    学生信息管理系统(Tkinter、mariadb实现)
    版本:2.0
    作者:xxx
    简述:该系统可使用管理员和学生身份登录,
        管理员身份拥有功能:显示所有学生信息、学生排序、修改信息、删除信息、查找信息
        学生身份拥有功能:查看自身信息
        系统可在多个界面自由切换,不同身份间自由切换,拥有错误输入处理能力,其他功能拓展能力
    
        2.0版本更新:
        新增:mariadb数据库操作,如果连接成功所以操作后的数据将上传数据库,若无法连接数据库原本的功能不会受到影响
        修复少量bug,对界面进行优化,增加按钮接触变化效果
    
    main.py需要配合user.py使用
    """
    
    from tkinter import *
    from tkinter.ttk import Treeview
    import tkinter.messagebox
    import user124
    import pymysql
    
    
    # ------------------全局变量-------------------------
    # 连接数据库的标志
    FlAG_CONNECT = 0
    # 数据库游标
    CURSOR = 0
    # 数据库连接类
    DB = 0
    
    # -------------------------Tkinter基本框架-----------------------------------
    root = Tk()
    root.title('学生信息管理系统  --by xxx')  # 窗口标题
    root.geometry('600x450')  # 窗口大小
    root.resizable(width=False, height=False)  # 设置窗口无法拉伸
    frame = Frame(root)
    
    # ----------------------------数据结构-----------------------------------------------------------
    student_list = [{'学号': '101', '姓名': '张三', '性别': '男', '语文': '100', '数学': '100', '英语': '50'},
                    {'学号': '102', '姓名': '李四', '性别': '男', '语文': '9', '数学': '100', '英语': '9'},
                    {'学号': '103', '姓名': '王五', '性别': '男', '语文': '60', '数学': '77', '英语': '70'},
                    {'学号': '104', '姓名': '赵六', '性别': '男', '语文': '90', '数学': '80', '英语': '66'},
                    {'学号': '105', '姓名': '小红', '性别': '女', '语文': '50', '数学': '88', '英语': '80'},
                    {'学号': '106', '姓名': '老王', '性别': '男', '语文': '78', '数学': '60', '英语': '60'}]
    
    cols = ('学号', '姓名', '性别', '语文(点击排序)', '数学(点击排序)', '英语(点击排序)')
    
    
    # ---------------------------以下是各功能模块的函数-----------------------------------------------
    def connect_mariadb():
        """
        用于连接数据库
        :return:
        """
        global student_list
        global FlAG_CONNECT
        global CURSOR
        global DB
        # 建立连接
        try:
            DB = pymysql.connect(host="", user="", passwd="",
                                 db="gdupt", charset='utf8')
            # 使用 cursor() 方法创建一个游标对象 cursor
            CURSOR = DB.cursor(cursor=pymysql.cursors.DictCursor)
            # 使用 execute()  方法执行 SQL 查询
            CURSOR.execute("SELECT VERSION()")
            # 使用 fetchone() 方法获取单条数据.
            data = CURSOR.fetchone()
            print("Database version : %s " % data)
    
            CURSOR.execute("select * from studentinfo")
            student_list = CURSOR.fetchall()
            # print(student_list)
            FlAG_CONNECT = 1
    
        except pymysql.err.OperationalError:
            print("无法连接数据库,将使用初始数据")
            return
    
    
    def treeview_sort_column(tv, col, reverse):
        """
        功能:对学生信息进行排序
        :param tv: treeview类
        :param col: treeview列表
        :param reverse: 正反序
        """
        try:
            lis = [(tv.set(k, col), k) for k in tv.get_children('')]
            lis.sort(key=lambda t: int(t[0]), reverse=reverse)
    
            for index, (val, k) in enumerate(lis):
                tv.move(k, '', index)
            tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))
        except ValueError:
            return
    
    
    def admin_modify(student_id):
        """
        功能:管理员身份对学生信息进行修改
        :param student_id: 学生序号
        """
        for widget in root.winfo_children():
            widget.destroy()
        Label(root, text='学生信息管理系统', font=('Arial', 16), width=16, height=2).pack()
        Label(root, text='修改学生信息', font=('Arial', 12), width=16, height=1).pack()
        try:
            if len(student_id) > 1:
                stu_id = '1' + str(student_id)
            else:
                stu_id = '10' + str(student_id)
            Label(root, text="学号:{0}".format(student_list[int(student_id) - 1]['学号']),
                  font=('Arial', 12), width=10, height=1).place(x=210, y=100, anchor='nw')
            Label(root, text="姓名:", font=('Arial', 12), width=10, height=1).place(x=196, y=130, anchor='nw')
            entry_name = Entry(root, show=None)
            entry_name.insert(0, str(student_list[int(student_id) - 1]['姓名']))
            entry_name.place(x=270, y=130, anchor='nw')
    
            Label(root, text="性别:", font=('Arial', 12), width=10, height=1).place(x=196, y=160, anchor='nw')
            entry_gender = Entry(root, show=None)
            entry_gender.insert(0, str(student_list[int(student_id) - 1]['性别']))
            entry_gender.place(x=270, y=160, anchor='nw')
    
            Label(root, text="语文:", font=('Arial', 12), width=10, height=1).place(x=196, y=190, anchor='nw')
            entry_chinese = Entry(root, show=None)
            entry_chinese.insert(0, str(student_list[int(student_id) - 1]['语文']))
            entry_chinese.place(x=270, y=190, anchor='nw')
            Label(root, text="原:{}分".format(student_list[int(student_id) - 1]['语文']),
                  font=('Arial', 12), width=8, height=1).place(x=420, y=190, anchor='nw')
            student_list[int(student_id) - 1]['语文'] = entry_chinese.get()
    
            Label(root, text="数学:", font=('Arial', 12), width=10, height=1).place(x=196, y=220, anchor='nw')
            entry_math = Entry(root, show=None)
            entry_math.insert(0, str(student_list[int(student_id) - 1]['数学']))
            entry_math.place(x=270, y=220, anchor='nw')
            Label(root, text="原:{}分".format(student_list[int(student_id) - 1]['数学']),
                  font=('Arial', 12), width=8, height=1).place(x=420, y=220, anchor='nw')
    
            Label(root, text="英语:", font=('Arial', 12), width=10, height=1).place(x=196, y=250, anchor='nw')
            entry_english = Entry(root, show=None)
            entry_english.insert(0, str(student_list[int(student_id) - 1]['英语']))
            entry_english.place(x=270, y=250, anchor='nw')
            Label(root, text="原:{}分".format(student_list[int(student_id) - 1]['英语']),
                  font=('Arial', 12), width=8, height=1).place(x=420, y=250, anchor='nw')
    
            def update_student():
                global FlAG_CONNECT
                student_list[int(student_id) - 1]['姓名'] = entry_name.get()
                student_list[int(student_id) - 1]['性别'] = entry_gender.get()
                student_list[int(student_id) - 1]['语文'] = entry_chinese.get()
                student_list[int(student_id) - 1]['数学'] = entry_math.get()
                student_list[int(student_id) - 1]['英语'] = entry_english.get()
                # -------------------数据库操作相关-------------------------------------
                try:
                    sql = "update studentinfo set 姓名='%s',性别='%s',语文='%s',数学='%s',英语='%s' where 学号=%s;" \
                        % (entry_name.get(), entry_gender.get(), entry_chinese.get(), entry_math.get(),
                           entry_english.get(), stu_id)
                    CURSOR.execute(sql)
                    DB.commit()
                except pymysql.err.OperationalError:
                    print("数据库已断开连接,无法保存数据")
                    FlAG_CONNECT = 0
                except AttributeError:
                    print("数据库已断开连接,无法保存数据")
                    FlAG_CONNECT = 0
                # --------------------------------------------------------------------
            Button(root, text='确认', width=10, height=1, overrelief='groove',
                   command=lambda: (update_student(), admin_display())).place(x=250, y=310, anchor='nw')
            Button(root, text='←返回', width=10, height=1, overrelief='groove',
                   command=lambda: admin_display()).place(x=500, y=12, anchor='nw')
        except TypeError:
            admin_display()
    
    
    def admin_add_student():
        """
        功能:管理员身份增加学生信息
        """
        for widget in root.winfo_children():
            widget.destroy()
        Label(root, text='学生信息管理系统', font=('Arial', 16), width=16, height=2).pack()
        Label(root, text='增加学生信息', font=('Arial', 12), width=16, height=1).pack()
        Label(root, text="学号:{0}".format(str(int(student_list[0]['学号']) + len(student_list))),
              font=('Arial', 12), width=10, height=1).place(x=210, y=100, anchor='nw')
    
        Label(root, text="姓名:", font=('Arial', 12), width=10, height=1).place(x=196, y=130, anchor='nw')
        entry_name = Entry(root, show=None)
        entry_name.insert(0, '小明')
        entry_name.place(x=270, y=130, anchor='nw')
    
        Label(root, text="性别:", font=('Arial', 12), width=10, height=1).place(x=196, y=160, anchor='nw')
        entry_gender = Entry(root, show=None)
        entry_gender.insert(0, '男')
        entry_gender.place(x=270, y=160, anchor='nw')
    
        Label(root, text="语文:", font=('Arial', 12), width=10, height=1).place(x=196, y=190, anchor='nw')
        entry_chinese = Entry(root, show=None)
        entry_chinese.insert(0, '80')
        entry_chinese.place(x=270, y=190, anchor='nw')
    
        Label(root, text="数学:", font=('Arial', 12), width=10, height=1).place(x=196, y=220, anchor='nw')
        entry_math = Entry(root, show=None)
        entry_math.insert(0, '80')
        entry_math.place(x=270, y=220, anchor='nw')
    
        Label(root, text="英语:", font=('Arial', 12), width=10, height=1).place(x=196, y=250, anchor='nw')
        entry_english = Entry(root, show=None)
        entry_english.insert(0, '80')
        entry_english.place(x=270, y=250, anchor='nw')
    
        def update_student():
            global FlAG_CONNECT
            stu_id = str(int(student_list[0]['学号']) + len(student_list))
            stu_name = entry_name.get()
            stu_gender = entry_gender.get()
            stu_chinese = entry_chinese.get()
            stu_math = entry_math.get()
            stu_english = entry_english.get()
            student_list.append({'学号': stu_id, '姓名': stu_name, '性别': stu_gender, '语文': stu_chinese, '数学': stu_math,
                                 '英语': stu_english})
            # -------------------数据库操作相关-------------------------------------
            try:
                sql = "insert into studentinfo(学号,姓名,性别,语文,数学,英语)values(%s,%s,%s,%s,%s,%s);"
                param = (stu_id, stu_name, stu_gender, stu_chinese, stu_math, stu_english)
                CURSOR.execute(sql, param)
                DB.commit()
            except pymysql.err.OperationalError:
                print("数据库已断开连接,无法保存数据")
                FlAG_CONNECT = 0
            except AttributeError:
                print("数据库已断开连接,无法保存数据")
                FlAG_CONNECT = 0
            # -------------------------------------------------------------------
        Button(root, text='确认', width=10, height=1, overrelief='groove',
               command=lambda: (update_student(), admin_display())).place(x=250, y=310, anchor='nw')
        Button(root, text='←返回', width=10, height=1, overrelief='groove',
               command=lambda: admin_display()).place(x=500, y=12, anchor='nw')
    
    
    def admin_delete_student(tv, student_id):
        """
        功能:管理员身份删除学生
        :param tv: treeview类
        :param student_id: 学生序号
        """
        global FlAG_CONNECT
        try:
            if len(student_id) > 1:
                stu_id = '1' + str(student_id)
            else:
                stu_id = '10'+str(student_id)
            tv.item('I00' + str(student_id), values=(student_list[int(student_id) - 1]['学号'],
                                                     '空', '空', '0', '0', '0'))
            student_list[int(student_id) - 1]['姓名'] = 'None'
            student_list[int(student_id) - 1]['性别'] = 'None'
            student_list[int(student_id) - 1]['语文'] = '0'
            student_list[int(student_id) - 1]['数学'] = '0'
            student_list[int(student_id) - 1]['英语'] = '0'
            # -------------------数据库操作相关-------------------------------------
            try:
                sql = "update studentinfo set 姓名='%s',性别='%s',语文='%s',数学='%s',英语='%s' where 学号=%s;" \
                    % ("空", "空", "0", "0", "0", stu_id)
                CURSOR.execute(sql)
                DB.commit()
            except pymysql.err.OperationalError:
                print("数据库已断开连接,无法保存数据")
                FlAG_CONNECT = 0
            except AttributeError:
                print("数据库已断开连接,无法保存数据")
                FlAG_CONNECT = 0
            # -------------------------------------------------------------------
        except TclError:
            return
        except TypeError:
            return
    
    
    def admin_find_student(entry):
        """
        功能:管理员身份查找学生
        :param entry: Entry类
        """
        student_id = entry.get()
        student_name = entry.get()
        for stu in student_list:
            if stu['姓名'] == student_name:
                tkinter.messagebox.showinfo('查找窗口', "该学生信息如下:               \n"
                                                    "学号:{0} \n姓名:{1} \n性别:{2} \n语文:{3} \n数学:{4} \n英语:{5}"
                                            .format(stu['学号'], stu['姓名'], stu['性别'], stu['语文'], stu['数学'],
                                                    stu['英语']))
                return
        try:
            tkinter.messagebox.showinfo('查找窗口', "该学生信息如下:               \n"
                                                "学号:{0} \n姓名:{1} \n性别:{2} \n语文:{3} \n数学:{4} \n英语:{5}"
                                        .format(student_list[int(student_id) - 1]['学号'],
                                                student_list[int(student_id) - 1]['姓名'],
                                                student_list[int(student_id) - 1]['性别'],
                                                student_list[int(student_id) - 1]['语文'],
                                                student_list[int(student_id) - 1]['数学'],
                                                student_list[int(student_id) - 1]['英语']))
        except IndexError:
            tkinter.messagebox.showinfo("查找窗口", "查找失败,请输入学号最后一位或姓名")
        except ValueError:
            tkinter.messagebox.showinfo("查找窗口", "查找失败,请输入学号最后一位或姓名")
    
    
    def focus(tv):
        """
        获取treeview焦点
        :param tv: treeview类
        """
        try:
            return tv.focus()[-1]
        except IndexError:
            return
    
    
    def admin_display():
        """
        功能:显示管理员界面
        """
        for widget in root.winfo_children():
            widget.destroy()
        admin_object.student_index = 0  # 用于防止重复打印学生信息
        if FlAG_CONNECT:
            Label(root, text='数据库连接成功', font=('Arial', 12), fg='red', width=16, height=2).place(x=0, y=0, anchor='nw')
        else:
            Label(root, text='数据库连接失败', font=('Arial', 12), fg='red', width=16, height=2).place(x=0, y=0, anchor='nw')
    
        Label(root, text='学生信息管理系统', font=('Arial', 16), width=16, height=2).place(x=190, y=0, anchor='nw')
        ybar = Scrollbar(root, orient='vertical')
        treeview = Treeview(root, height=31, show="headings", columns=cols, yscrollcommand=ybar.set)
        ybar['command'] = treeview.yview
        for col in cols:
            treeview.heading(col, text=col, command=lambda _col=col: treeview_sort_column(treeview, _col, False))
            treeview.column(col, width=10, anchor='n')  # 每一行的宽度,'w'意思为靠右
    
        ybar.pack(side=RIGHT, fill=Y)
        treeview.place(x=0, y=80, anchor='nw', width=550)
    
        Button(root, text='更新学生信息', width=10, height=1, overrelief='groove',
               command=lambda _treeview=treeview: admin_object.print_student(_treeview, CURSOR,
                                                                             FlAG_CONNECT)).place(x=8, y=43, anchor='nw')
        Button(root, text='修改(选中信息)', width=15, height=1, overrelief='groove',
               command=lambda: admin_modify(focus(treeview))).place(x=100, y=43, anchor='nw')
        Button(root, text='增加学生', width=8, height=1, overrelief='groove',
               command=lambda: admin_add_student()).place(x=228, y=43, anchor='nw')
        Button(root, text='删除学生', width=8, height=1, overrelief='groove',
               command=lambda: admin_delete_student(treeview, focus(treeview))).place(x=306, y=43, anchor='nw')
        entry_find = Entry(root, show=None)
        entry_find.place(x=390, y=48, anchor='nw')
        Button(root, text='查找', width=3, height=1, overrelief='groove',
               command=lambda: admin_find_student(entry_find)).place(x=540, y=43, anchor='nw')
        Button(root, text='←退出', width=10, height=1, overrelief='groove',
               command=lambda: login_display()).place(x=500, y=12, anchor='nw')
    
    
    def student_zhangsan_display():
        """
        功能:显示学生张三界面
        """
        for widget in root.winfo_children():
            widget.destroy()
        if FlAG_CONNECT:
            Label(root, text='数据库连接成功', font=('Arial', 12), fg='red', width=16, height=2).place(x=0, y=0, anchor='nw')
        else:
            Label(root, text='数据库连接失败', font=('Arial', 12), fg='red', width=16, height=2).place(x=0, y=0, anchor='nw')
        Label(root, text='学生信息管理系统', font=('Arial', 16), width=16, height=2).pack()
        Label(root, text='学号:{0}'.format(student_list[0]['学号']),
              font=('Arial', 16), width=16, height=2).place(x=196, y=80, anchor='nw')
        Label(root, text='姓名:{0}'.format(student_list[0]['姓名']),
              font=('Arial', 16), width=16, height=2).place(x=200, y=120, anchor='nw')
        Label(root, text='性别:{0}'.format(student_list[0]['性别']),
              font=('Arial', 16), width=16, height=2).place(x=190, y=160, anchor='nw')
        Label(root, text='语文:{0}'.format(student_list[0]['语文']),
              font=('Arial', 16), width=16, height=2).place(x=196, y=200, anchor='nw')
        Label(root, text='数学:{0}'.format(student_list[0]['数学']),
              font=('Arial', 16), width=16, height=2).place(x=196, y=240, anchor='nw')
        Label(root, text='英语:{0}'.format(student_list[0]['英语']),
              font=('Arial', 16), width=16, height=2).place(x=190, y=280, anchor='nw')
        Button(root, text='←退出', width=10, height=1, overrelief='groove',
               command=lambda: login_display()).place(x=500, y=12, anchor='nw')
    
    
    def login(radiobutton_var, entry_account, entry_password):
        """
        功能:登录界面信息处理
        :param radiobutton_var: radiobutton类
        :param entry_account: Entry类
        :param entry_password: Entry类
        """
        # ---------------------------------管理员身份登录------------------------------------------------------
        if radiobutton_var.get() == 'admin':
            if entry_account.get() == admin_object.account and entry_password.get() == admin_object.password:
                # --管理员身份组件--
                admin_display()
            else:
                Label(root, text='账号或密码错误', font=('Arial', 12),
                      width=15, height=1, fg='red').place(x=220, y=190, anchor='nw')
        # ------------------------------------学生身份登录-----------------------------------------------------------
        elif radiobutton_var.get() == 'student':
            if entry_account.get() == student_object.account and entry_password.get() == student_object.password:
                # --学生身份组件--
                student_zhangsan_display()
        else:
            Label(root, text='未选择登录身份', font=('Arial', 12),
                  width=15, height=1, fg='red').place(x=220, y=190, anchor='nw')
    
    
    def login_display():
        """
        功能:显示登录界面所有组件
        """
        for widget in root.winfo_children():
            widget.destroy()
        Label(root, text='学生信息管理系统', font=('Arial', 16), width=16, height=5).pack()
        Label(root, text='请选择登录身份', font=('Arial', 12), fg='red', width=12, height=3).place(x=210, y=80, anchor='nw')
    
        radiobutton_var = StringVar()
        radiobutton_var.set(' ')
        student_radiobutton = Radiobutton(root, text='学生', font=('Arial', 12),
                                          variable=radiobutton_var, value='student')
        student_radiobutton.place(x=210, y=120, anchor='nw')
        admin_radiobutton = Radiobutton(root, text='老师或管理员', font=('Arial', 12),
                                        variable=radiobutton_var, value='admin')
        admin_radiobutton.place(x=210, y=150, anchor='nw')
    
        Label(root, text='账号', font=('Arial', 12), width=5, height=1).place(x=180, y=220, anchor='nw')
        entry_account = Entry(root, show=None)
        entry_account.insert(0, '1234')
        entry_account.place(x=230, y=220, anchor='nw')
        Label(root, text='密码', font=('Arial', 12), width=5, height=1).place(x=180, y=250, anchor='nw')
        entry_password = Entry(root, show='*')
        entry_password.insert(0, '1234')
        entry_password.place(x=230, y=250, anchor='nw')
    
        Button(root, text='登录', width=15, height=2, overrelief='groove',
               command=lambda: login(radiobutton_var, entry_account, entry_password)).place(x=240, y=280, anchor='nw')
    
    
    if __name__ == '__main__':
        connect_mariadb()
        # --------------实例化管理员类和学生类------------------
        admin_object = user124.Admin(cols, student_list)
        student_object = user124.StudentZhangsan()
    
        login_display()
        root.mainloop()
    
    
    class Admin:
        def __init__(self, cols, stu_list):
            self.account = '1234'
            self.password = '1234'
            self.cols = cols
            self.student_list = stu_list
            self.student_index = 0 # 用于防止重复打印学生信息
    
        def print_student(self, tv, cursor, connect):
            if connect == 1:
                cursor.execute("select * from studentinfo")
                self.student_list = cursor.fetchall()
            # print(self.student_list)
            if self.student_index == 0:
                for student_index in self.student_list:
                    tv.insert("", "end", values=(student_index['学号'], student_index['姓名'],
                                                 student_index['性别'], student_index['语文'],
                                                 student_index['数学'], student_index['英语']))
            self.student_index = 1
    
    
    class StudentZhangsan:
        def __init__(self):
            self.account = '1234'
            self.password = '1234'
    
    
    

    第三个版本(通常的数据库版本):

    # -*-coding:utf-8-*-
    import pymysql
    
    
    def menu():
        print("-------------学生信息管理系统-------------")
        print("-" * 35)
        print("           功能菜单          ")
        print("          1、添加学生的信息           ")
        print("          2、删除学生的信息           ")
        print("          3、修改学生的信息           ")
        print("          4、查询学生的信息           ")
        print("          5、显示所有学生的信息        ")
        print("          6、对学生成绩进行排序        ")
        print("          7、退出本系统              ")
        print("-" * 35)
    
    
    def connection():
        try:
            db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
            print('数据库连接成功!')
        except pymysql.Error as e:
            print('数据库连接失败' + str(e))
        db.close()
    
    
    def CreateTable():
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cur = db.cursor()
        cur.execute('DROP TABLE IF EXISTS Student')
        sql = "CREATE TABLE studentinfo (Name varchar(20) NOT NULL,Sex varchar(4) NOT NULL ,Chinese float,Math float,English float )"
        cur.execute(sql)
        db.close()
    
    
    def Insert():  # 添加
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cur = db.cursor()
        sql = " INSERT INTO studentinfo (ID, Name, Sex, Chinese, Math, English, Total) VALUE (%s,%s,%s,%s,%s,%s,%s) "
        a = input("请输入需要添加的学生学号:")
        b = input("请输入需要添加的学生姓名:")
        c = input("请输入需要添加的学生性别:")
        d = input("请输入需要添加的学生语文成绩:")
        e = input("请输入需要添加的学生数学成绩:")
        f = input("请输入需要添加的学生英语成绩:")
        total = int(d) + int(e) + int(f)
        value = (a, b, c, d, e, f, total)
    
        try:
            cur.execute(sql, value)
            db.commit()
            print('学生信息添加成功!')
        except pymysql.Error as e:
            print("学生信息添加失败:" + str(e))
            db.rollback()
        db.close()
    
    
    def deletedata():  # 删除
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cur = db.cursor()
        sql = "DELETE FROM studentinfo where ID=%s"
        a = input("请输入要删除学生的学号:")
        value = (a)
        try:
            cur.execute(sql, value)
            db.commit()
            print('学生信息删除成功')
        except pymysql.Error as e:
            print("学生信息删除失败:" + str(e))
            # 发生错误时回滚
            db.rollback()
    
    
    def querystudentinfo(querystudentid):  # 查询
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cursor = db.cursor()
        sql = "select * from studentinfo where ID=%s" % querystudentid
        cursor.execute(sql)
        if cursor.rowcount == 0:
            print("不存在该学生信息")
            return False
        else:
            print("该学生信息如下:")
            results = cursor.fetchall()  # 获取数据
            print("学号=%s,姓名=%s,性别=%s,语文=%s,数学=%s,英语=%s,总分=%s" % \
                  (results[0][0], results[0][1], results[0][2], results[0][3], results[0][4], results[0][5], results[0][6]))
            return True
    
    
    def update():  # 修改
        modifyid = input("请输入要修改的学生学号:")
        if querystudentinfo(modifyid):
            name = input("请重新输入学生姓名:")
            sex = input("请重新输入学生性别:")
    
            chinese = input("请重新输入要修改的学生语文成绩:")
            while not chinese.isdigit() or float(chinese) > 100 or float(chinese) < 0:
                chinese = input("输入错误,请重新输入:")
    
            math = input("请重新输入要修改的学生数学成绩:")
            while not math.isdigit() or float(math) > 100 or float(math) < 0:
                math = input("输入错误,请重新输入:")
    
            english = input("请重新输入要修改的学生英语成绩:")
            while not english.isdigit() or float(english) > 100 or float(english) < 0:
                english = input("输入错误,请重新输入:")
    
            print("  学生信息修改成功!  ")
    
            total = float(chinese) + float(math) + float(english)
    
    
            db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
            cursor = db.cursor()
            sql1 = "update studentinfo set name ='%s' where id = %s" % (name, modifyid)
            cursor.execute(sql1)
            sql2 = "update studentinfo set sex ='%s' where id = %s" % (sex, modifyid)
            cursor.execute(sql2)
            sql3 = "update studentinfo set chinese = %s where id = %s" % (chinese, modifyid)
            cursor.execute(sql3)
            sql4 = "update studentinfo set math = %s where id = %s" % (math, modifyid)
            cursor.execute(sql4)
            sql5 = "update studentinfo set english = %s where id =%s" % (english, modifyid)
            cursor.execute(sql5)
            sql6 = "update studentinfo set total = %s where id = %s" % (total, modifyid)
            cursor.execute(sql6)
    
            db.commit()
            db.close()
    
    
    def Find():  # 显示
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cur = db.cursor()
        sql = "SELECT * FROM studentinfo"
        try:
            cur.execute(sql)
            results = cur.fetchall()
            print("=" * 30)
            print("学号      姓名     性别     语文      数学      英语      总分")
            for row in results:
                id = row[0]
                name = row[1]
                sex = row[2]
                chinese = row[3]
                math = row[4]
                english = row[5]
                total = row[6]
                print('%s     %s     %s      %s     %s      %s     %s' % (id , name, sex, chinese, math, english, total))
            print("=" * 30)
        except pymysql.Error as e:
            print("数据显示失败:" + str(e))
        db.close()
    
    
    def sort():  # 排序
        db = pymysql.connect(host="", user="", passwd="", db="", port=3306,charset="utf8")
        cursor = db.cursor()
        sql = "select * from studentinfo"
        cursor.execute(sql)
        results = cursor.fetchall()
        result = list(results)
        result.sort(key=lambda row: row[6], reverse=True)
        print("学生信息按总成绩排序如下:")
        print("=" * 30)
        print("学号   姓名   性别   语文    数学    英语    总分")
        for row in result:
            id = row[0]
            name = row[1]
            sex = row[2]
            chinese = row[3]
            math = row[4]
            english = row[5]
            total = row[6]
            # 打印结果
    
            print('%s     %s     %s      %s     %s      %s     %s ' % (id , name, sex, chinese, math, english, total))
        print("=" * 30)
    
    def main():
        connection()
        while True:
            menu()
            number = input("请输入功能菜单的对应数字:")
            if number == '1':
                Insert()
            elif number == '2':
                deletedata()
            elif number == '3':
                update()
            elif number == '4':
                querystudentid = input("请输入要查询的学生学号:")
                querystudentinfo(querystudentid)
            elif number == '5':
                Find()
            elif number == '6':
                sort()
            elif number >= '7':
                print("                                ")
                print("********* 欢迎您再次使用!!!*********")
                break
    main()
    
    

    文章或代码如有错误和纰漏,欢迎批评指正!!!

    谢谢!!!

    展开全文
  • Python成绩管理系统小程序

    千次阅读 2018-08-20 16:58:08
    一、代码 1.main from tkinter import * from LoginPage import * ...root.title('Python成绩管理系统_by vision') LoginPage(root) root.mainloop()   2.MainPage from tkinter import * from...

    一、代码

    1.main

    from tkinter import *  
    from LoginPage import *  
      
    root = Tk()  
    root.title('Python成绩管理系统_by vision')  
    LoginPage(root)  
    root.mainloop()  

     

    2.MainPage

    from tkinter import *  
    from view import *  #菜单栏对应的各个子页面  
      
    class MainPage(object):  
        def __init__(self, master=None):  
            self.root = master #定义内部变量root  
            self.root.geometry('%dx%d' % (600, 400)) #设置窗口大小  
            self.createPage()  
      
        def createPage(self):  
            self.inputPage = InputFrame(self.root) # 创建不同Frame  
            self.deletePage = DeleteFrame(self.root)
            self.modifyPage = ModifyFrame(self.root)
            self.queryPage = QueryFrame(self.root) 
            self.inputPage.pack() #默认显示数据录入界面  
            menubar = Menu(self.root)  
            menubar.add_command(label='增', command = self.inputData)  
            menubar.add_command(label='删', command = self.deleteData)  
            menubar.add_command(label='改', command = self.modifyData)  
            menubar.add_command(label='查', command = self.queryData)  
            self.root['menu'] = menubar  # 设置菜单栏  
      
        def inputData(self):  
            self.inputPage.pack()  
            self.queryPage.pack_forget()  
            self.deletePage.pack_forget()
            self.modifyPage.pack_forget() 

        def deleteData(self):  
            self.inputPage.pack_forget()  
            self.queryPage.pack_forget()  
            self.deletePage.pack()  
            self.modifyPage.pack_forget()

        def modifyData(self):  
            self.inputPage.pack_forget()  
            self.queryPage.pack_forget()  
            self.deletePage.pack_forget()  
            self.modifyPage.pack()         
            
        def queryData(self):  
            self.inputPage.pack_forget()  
            self.queryPage.pack()  
            self.deletePage.pack_forget()  
            self.modifyPage.pack_forget()  
      
     

    3.view

    from tkinter import *  
    from tkinter.messagebox import *  
      
    class InputFrame(Frame): # 继承Frame类  
        def __init__(self, master=None):  
            Frame.__init__(self, master)  
            self.root = master #定义内部变量root  
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.E3 = Entry(self)
            self.E4 = Entry(self)
            self.E5 = Entry(self)
            self.createPage()  

        def Isspace(self,text):
            temp = 0
            for i in text:
               if not i.isspace():
                   temp = 1
                   break;

            if temp==1:
                return 0
            else:
                return 1


        def write(self,name,num,course,score):
            f = open('成绩.csv','r',encoding='utf-8')
            for line in f.readlines():
                info = line[:-1].split(",")
                if len(info)<4:
                    break
                if info[1]==num and info[2]==course:
                     messagebox.showinfo(title='结果', message ="已存在该学生科目信息!")
                     f.close()
                     return

            f.close()
            f = open('成绩.csv','a',encoding='utf-8')
            f.write('{},{},{},{}\n'.format(name,num,course,score))
            f.close()
            messagebox.showinfo(title='提示', message ="写入成功")
            return
        
        def click(self):
            name = self.E1.get()
            num = self.E2.get()
            course = self.E3.get()
            score = self.E4.get()
            if self.Isspace(name) or self.Isspace(num) or self.Isspace(course) or self.Isspace(score) :
                messagebox.showinfo(title='提示', message ="输入项为空")
            else:
                self.write(name,num,course,score)
                
            
            
        def createPage(self):  
            Label(self).grid(row=0, stick=W, pady=10)
            
            Label(self, text = '姓名: ').grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)

            Label(self, text = '学号: ').grid(row=2, stick=W, pady=10)
            self.E2.grid(row=2, column=1, stick=E)

            Label(self, text = '科目: ').grid(row=3, stick=W, pady=10) 
            self.E3.grid(row=3, column=1, stick=E) 

            Label(self, text = '成绩: ').grid(row=4, stick=W, pady=10)
            self.E4.grid(row=4, column=1, stick=E)       
            
            Button(self, text='录入',command=self.click).grid(row=6, column=1, stick=E, pady=10)  
      
      
    class DeleteFrame(Frame): # 继承Frame类  
        def __init__(self, master=None):  
            Frame.__init__(self, master)  
            self.root = master #定义内部变量root
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.createPage()
            
        def Isspace(self,text):
            temp = 0
            for i in text:
               if not i.isspace():
                   temp = 1
                   break;

            if temp==1:
                return 0
            else:
                return 1

        def delete(self,num,course):
            temp = 0
            with open("成绩.csv","r",encoding="utf-8") as f:
                lines = f.readlines()
       
            with open("成绩.csv","w",encoding="utf-8") as f_w:
                for line in lines:
                    info = line[:-1].split(",")
                    if info[1]==num and info[2]==course:
                        temp = 1
                        continue
                    f_w.write(line)
            if temp==0:
                messagebox.showinfo(title='提示', message ="没有该信息")
            else:
                messagebox.showinfo(title='提示', message ="删除成功")
            
        def click(self):
            num = self.E1.get()
            course = self.E2.get()
            if self.Isspace(num) or self.Isspace(course):
                messagebox.showinfo(title='提示', message ="输入项为空")
            else:
                self.delete(num,course)
                
        def createPage(self):
            Label(self).grid(row=0, stick=W, pady=10)
            
            Label(self, text = '学号: ').grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)

            Label(self, text = '科目: ').grid(row=2, stick=W, pady=10)
            self.E2.grid(row=2, column=1, stick=E)

            Button(self, text='删除',command=self.click).grid(row=6, column=1, stick=E, pady=10)  
      
      
    class ModifyFrame(Frame): # 继承Frame类  
        def __init__(self, master=None):  
            Frame.__init__(self, master)  
            self.root = master #定义内部变量root  
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.E3 = Entry(self)
            self.E4 = Entry(self)
            self.E5 = Entry(self)
            self.createPage()  

        def Isspace(self,text):
            temp = 0
            for i in text:
               if not i.isspace():
                   temp = 1
                   break;

            if temp==1:
                return 0
            else:
                return 1

            
        def modify(self,name,num,course,score):
            temp = 0
            with open("成绩.csv","r",encoding="utf-8") as f:
                lines = f.readlines()
       
            with open("成绩.csv","w",encoding="utf-8") as f_w:
                for line in lines:
                    info = line[:-1].split(",")
                    if info[1]==num and info[2]==course:
                        temp = 1
                        f_w.write('{},{},{},{}\n'.format(name,num,course,score))
                        continue
                    f_w.write(line)
            if temp==0:
                messagebox.showinfo(title='提示', message ="没有该信息")
            else:
                messagebox.showinfo(title='提示', message ="修改成功")
            
        def click(self):
            name = self.E1.get()
            num = self.E2.get()
            course = self.E3.get()
            score = self.E4.get()
            if self.Isspace(name) or self.Isspace(num) or self.Isspace(course) or self.Isspace(score) :
                messagebox.showinfo(title='提示', message ="输入项为空")
            else:
                self.modify(name,num,course,score)
            
            
        def createPage(self):  
            Label(self).grid(row=0, stick=W, pady=10)
            Label(self, text = '姓名: ').grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)

            Label(self, text = '学号: ').grid(row=2, stick=W, pady=10)
            self.E2.grid(row=2, column=1, stick=E)

            Label(self, text = '科目: ').grid(row=3, stick=W, pady=10) 
            self.E3.grid(row=3, column=1, stick=E) 

            Label(self, text = '成绩: ').grid(row=4, stick=W, pady=10)
            self.E4.grid(row=4, column=1, stick=E)       
            
            Button(self, text='修改',command=self.click).grid(row=6, column=1, stick=E, pady=10)  

    class QueryFrame(Frame): # 继承Frame类  
        def __init__(self, master=None):  
            Frame.__init__(self, master)  
            self.root = master #定义内部变量root
            self.E1 = Entry(self)
            self.E2 = Entry(self)
            self.createPage()  

        def Isspace(self,text):
            temp = 0
            for i in text:
               if not i.isspace():
                   temp = 1
                   break;

            if temp==1:
                return 0
            else:
                return 1

        def query(self,num,course):
            f = open('成绩.csv','r',encoding='utf-8')
            for line in f.readlines():
                info = line[:-1].split(",")
            if info[1]==num and info[2]==course:
                 messagebox.showinfo(title='结果', message ="姓名:"+info[0]+"\n学号:"+info[1]+"\n科目:"+info[2]+"\n成绩:"+info[3])
                 f.close()
                 return

            messagebox.showinfo(title='提示', message ="没有该信息")
            f.close()
            return        
            
            
        def click(self):
            num = self.E1.get()
            course = self.E2.get()
            if self.Isspace(num) or self.Isspace(course):
                messagebox.showinfo(title='提示', message ="输入项为空")
            else:
                self.query(num,course)
                
                
        def createPage(self):
            Label(self).grid(row=0, stick=W, pady=10)
            
            Label(self, text = '学号: ').grid(row=1, stick=W, pady=10)
            self.E1.grid(row=1, column=1, stick=E)

            Label(self, text = '科目: ').grid(row=2, stick=W, pady=10)
            self.E2.grid(row=2, column=1, stick=E)

            Button(self, text='查找',command=self.click).grid(row=6, column=1, stick=E, pady=10)  
      
     

    4.LoginPage

     

    from tkinter import *  
    from tkinter.messagebox import *  
    from MainPage import *  
      
    class LoginPage(object):  
        def __init__(self, master=None):  
            self.root = master #定义内部变量root  
            self.root.geometry('%dx%d' % (300, 180)) #设置窗口大小  
            self.username = StringVar()  
            self.password = StringVar()  
            self.createPage()  
      
        def createPage(self):
            self.page = Frame(self.root) #创建Frame  
            self.page.pack()  
            Label(self.page).grid(row=0, stick=W)  
            Label(self.page, text = '账户: ').grid(row=1, stick=W, pady=10)  
            Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E)  
            Label(self.page, text = '密码: ').grid(row=2, stick=W, pady=10)  
            Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E)  
            Button(self.page, text='登陆', command=self.loginCheck).grid(row=3, stick=W, pady=10)  
            Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=E)
            
      
        def loginCheck(self):  
            name = self.username.get()  
            password = self.password.get()
            if name=='admin' and password=='admin':
                self.page.destroy()  
                MainPage(self.root)  
            else:  
                showinfo(title='错误', message='账号或密码错误!') 

    二、注意事项

    Python代码对代码格式要求十分严格,编写过程要注意。

    三、结果

    展开全文
  • 讲起学生成绩管理系统,从大一C语言的课程设计开始,到大二的C++课程设计都是这个题,最近在学树莓派,好像树莓派常用Python编程,于是学了一波Python,看了一点基本的语法想写点东西练下手。开发环境:Ubuntu+...
  • 300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下使用链表来实现class Node(object):def __init__(self, data, pointer):self.data = dataself.next = pointer# 创建单链表class ...
  • /usr/bin/env python#coding:utf-8__author__='guolimin''''实现简单成绩管理系统1、添加成绩 -> 添加界面2、修改成绩3、删除成绩4、查看成绩(成绩排序:升序、降序)5、平均成绩通过字典中字典中字典实现增删改,...
  • 今天就把这个小程序分享出来吧~供Python新手小朋友学习~欲下载本文相关的完整代码及算例,请关注公众号【程序猿声】,后台回复【Python成绩管理】不包括【】即可1 总体构思其实类似这类信息管理系统之类的程序,核心...
  • 数据库系统课程设计任务书院(系):理学院专业:信息与计算科学姓名:学号:10课程设计题目:学生成绩管理系统成绩:问题阐述与分析:(主要阐述设计题目背景、设计实现意义及所要解决的主要问题,要明确给出所要用的...
  • 系统以菜单界面方式 (至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行 界面友好,演示程序以用户和计算机的对话方式进行 ( 1 )首先,看题目要求,每一条记录包括一个学生的姓名、性别、专业、出生 日期...
  • 本文实例为大家分享了python实现学生信息管理系统的具体代码,供大家参考,具体内容如下代码#存放学生信息student = list()#展示菜单def showMenu():print("1.增加学生信息")print("2.删除学生信息")print("3.修改...
  • 数据库管理系统是一种统一管理数据的专门软件系统。数据库是有组织的大量的共享的、长期存储在计算机中的数据集合。数据的管理经历了三个阶段,最早的是人工管理阶段。人工管理数据有四个特点:(1)数据不保存。因为...
  • 用golang简单编写学生信息管理系统发布时间:2020-09-04 11:45:16编辑:三青(参考七米老师的视频)查看次数:187student.gopackagemainimport"fmt"typestudentstruct{idintnamestringclassstring}//student类型的构造...
  • 摘要:这篇Python开发技术栏目下的“Python学生成绩管理系统简洁版”,介绍的技术点是“python学生成绩管理系统Python学生成绩管理、学生成绩管理系统Python、管理系统、学生”,希望对大家开发技术学习和问题...
  • 说到学生成绩管理系统,这是问题的C语言课程设计大一到大二的c++课程设计。最近我正在学习覆盆子π。看来,覆盆子π经常使用Python编程,所以我学会了一波又一波的Python。读完基本语法,我想写点东西来练习。开发环境:...
  • Python学生成绩管理系统源码+.exe,Pycharm及自带IDLE完美运行,可用来应付大作业或作为基础学习,内含心得体会以及细节注释,易根据自身需要修改,源码在system文件夹里
  • 本文实例为大家分享了Python实现学生成绩管理系统的具体代码,供大家参考,具体内容如下基本功能:输入并存储学生的信息:通过输入学生的学号、姓名、和分数,然后就可以把数据保存在建立的student文件里面。...
  • python学生成绩管理系统.rar
  • def enter_score(subject_no):for no, name in class_101.items():scores[subject_no][no] = \int(input("{},{}的{}成绩:". \format(no, name, subjects[subject_no])))print(scores)x = input("按Enter返回主菜单")...
  • 讲起学生成绩管理系统,从大一C语言的课程设计开始,到大二的C++课程设计都是这个题,最近在学树莓派,好像树莓派常用Python编程,于是学了一波Python,看了一点基本的语法想写点东西练下手。开发环境:Ubuntu+...
  • 上一次,公众号详情了如何使用 Python 实现单链表,下面让我们一探单链表的简单应用:在命令行,实现简易版成绩管理系统。这次的简易版成绩管理系统,主要有六大功能:添加学生信息、删除学生信息、修改学生信息、...
  • #!/usr/bin/env python #-*- coding:utf-8 -*- # file:p6.py # author:ytytyt # datetime:2021/4/22 21:04 # software: PyCharm ''' this is function...# 用面向对象, 实现一个学生Python成绩管理系统; # 学.
  • /usr/bin/env python#manage the grade of studentdefinit(date):date=[[],[],[],[],[]]returndatedefstore(date):ID=raw_input("Please your ID:")name=raw_input("Please your name:")engli.....
  • python成绩管理系统

    2020-05-25 22:48:20
    Python成绩管理系统 就上次发的成绩管理系统感觉不是很切合实际,我就再改了一下! def Welcome(): print("欢迎使用成绩管理系统!") print("在这里你可以查看同学的成绩!") def mune1(): print("1.显示数据") ...
  • 主要为大家详细介绍了简洁版的Python学生成绩管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 519
精华内容 207
关键字:

python成绩管理系统

python 订阅