|
【创意起源】 班级年级在每次考试后都会记录成绩,现在双减了。年级考试成绩每次不允许公布,但是为了掌握自己在班级的学习的情况,以及为了老师管理成绩方便,我用python制作了这个成绩管理程序,虽然这个程序有些简单但是也花费了我很长时间。 【使用的库】 本程序中使用了tkinter、os 库,其中【tkinter】是Python 的标准 GUI库。Python使用Tkinter可以快速的创建GUI应用程序。由于Tkinter是内置到python的安装包中、只要安装好 Python之后就能 import Tkinter 库,本程序中就是使用其创建简单的图形界面。【os】是与操作系统相关的标准库。如:文件,目录,执行系统命令等。我们的程序中使用它来在C盘下建立文件夹及数据文件。 【编程思路】 本程序主要由主界面、录入、删除、查看、修改界面构成,具体功能入下图6所示。 【配置编程环境】 打开Mind+软件,切换到Mind+软件的 Python 模式,Python 模式如下图7 切换到 Python 模式后,我们点击右侧文件目录,在“电脑中的文件” 中添加文件。点击位置如下图8数字序列①“添加本地文件夹”,我们在自己设定的路径下新建“原代码”文件夹用来存放 Python 程序和编程所需的素材。选中该文件夹后点击确定,建立一个python程序的编程环境。 之后,我们点击新建文件,即可在当前文件夹下创建 Python 程序 。我们这里创建了三个python程序,其名称为main.py(主程序界面),add.py(录入模块),chat.py(查看模块),dele.py(删除模块),modify.py(修改模块),empty.py(清空模块),leading.py(数据导入)如图9所示 【制作主界面】 实际上本次程序的图形界面主要是使用Tkinter库,而Tkinter程序做GUI只需做三个步骤: 第一步导入库: from tkinter import * 第二步创建实体: root = Tk() 第三步创建事件循环:root.mainloop() # create an eventloop 在主界面上主要涉及到的控件是标签和按钮,我们使用标签控件制作了一个标题,使用5个按钮作为打开其它窗体的交互开关。标签的呢比较简单就是显示文本信息,Button 控件实现程序与用户交互。通过用户点击按钮的行为来执行回调函数,是 Button 控件的主要作用。首先自定义一个函数或者方法,然后将函数与按钮关联起来,最后,当用户按下这个按钮时,Tkinter 就会自动调用相关函数。按钮通过command参数回调函数。 使用标签控件来设置一个标题: title = tkinter.Label(window, text='学生成绩管理系统', font = ('黑体', 40)) 使用按钮控件来作为交互开关: quit = tkinter.Button(window, text='退出, command=window.quit, width = 20, height = 1, font = ('宋体', 20))
主程序如下所示:
- import tkinter
- import os
- from add import *
- from dele import *
- from chat import *
- from modify import *
- #创建文件夹
- try:
- os.makedirs('C:/Data')
- except:
- pass
- #创建窗体设置基本属性
- window = tkinter.Tk()
- window.geometry("800x450")
- window.title("学生成绩管理系统")
- window.resizable(width=False, height=False)
- #标题
- title = tkinter.Label(window, text='学生成绩管理系统', font = ('黑体', 40))
- #按钮
- quit = tkinter.Button(window, text='退出, command=window.quit, width = 20, height = 1, font = ('宋体', 20))
- add = tkinter.Button(window, text='录入', command=add, width = 8, height = 1, font = ('宋体', 20))
- dele = tkinter.Button(window, text='删除', command=dele, width = 8, height = 1, font = ('宋体', 20))
- chat = tkinter.Button(window, text='查看', command=chat, width = 8, height = 1, font = ('宋体', 20))
- modify = tkinter.Button(window, text='修改', command=modify, width = 8, height = 1, font = ('宋体', 20))
- #标题按钮的位置
- title.place(x = 160, y = 40)
- quit.place(x=250, y=360)
- add.place(x=150, y = 260)
- dele.place(x = 500, y = 260)
- chat.place(x = 150, y = 160)
- modify.place(x = 500, y = 160)
-
- window.mainloop()
复制代码
【制作录入界面】 录入窗体上我们使用了标签、按钮、文本框,其主要作用是在文本框中输入学生基本信息(学号、姓名)及语数外三课成绩,程序对应在c:\data目录下新建5个TXT文档用于存储上述基本信息。程序中是通过文本框获取输入信息通过add_content()函数将其写入到对应的文本文件中。 使用文本框控件创建一个输入窗体 idEntry = tkinter.Entry(addWindow, width=20) 输入界面程序如下 - import tkinter
- import tkinter.messagebox
- from leading import leading_in_content
-
- def add():
- #创建窗体设置
- addWindow = tkinter.Tk()
- addWindow.title("添加界面")
- addWindow.geometry("600x400")
- addWindow.resizable(width=False, height=False)
- #标签控件设置
- idLabel = tkinter.Label(addWindow, text='学号', font=('宋体', 20))
- nameLabel = tkinter.Label(addWindow, text = '姓名', font=('宋体',20))
- achievementCLabel = tkinter.Label(addWindow, text='语文成绩', font=('宋体', 20))
- achievementMLabel = tkinter.Label(addWindow, text='数学成绩', font=('宋体', 20))
- achievementELabel = tkinter.Label(addWindow, text='英语成绩', font=('宋体', 20))
- #文本框控件设置
- idEntry = tkinter.Entry(addWindow, width=20)
- nameEntry = tkinter.Entry(addWindow,width = 20)
- achievementCEntry = tkinter.Entry(addWindow, width=20)
- achievementMEntry = tkinter.Entry(addWindow, width=20)
- achievementEEntry = tkinter.Entry(addWindow, width=20)
-
- #添加记录
- def add_content():
- if nameEntry.get() != '' and achievementCEntry.get() != '' and achievementMEntry.get() != '' and achievementEEntry.get() != '' and idEntry.get() != '':
- #学号
- data = open('C:/Data/Id.txt', "a", encoding="utf-8")
- data.write(idEntry.get() + ',')
- data.close()
- #姓名
- data = open('C:/Data/Name.txt', "a", encoding="utf-8")
- data.write(nameEntry.get() + ',')
- data.close()
- #语文
- data = open('C:/Data/AchievementC.txt', "a", encoding="utf-8")
- data.write(achievementCEntry.get() + ',')
- data.close()
- #数学
- data = open('C:/Data/AchievementM.txt', "a", encoding="utf-8")
- data.write(achievementMEntry.get() + ',')
- data.close()
- #外语
- data = open('C:/Data/AchievementE.txt', "a", encoding="utf-8")
- data.write(achievementEEntry.get() + ',')
- data.close()
-
- tkinter.messagebox.showinfo("信息","登记成功!")
- else:
- tkinter.messagebox.showerror("错误:","文本不能为空!")
- #销毁窗体函数
- def close():
- addWindow.destroy()
- #按钮控件设置
- sure = tkinter.Button(addWindow,text='登记',command=add_content,width = 10, height = 1,font = ('宋体', 20))
- back = tkinter.Button(addWindow,text='返回',command=close,width = 10, height = 1,font = ('宋体', 20))
- #标签控件位置
- idLabel.place(x = 100, y = 50)
- nameLabel.place(x = 100, y = 90)
- achievementCLabel.place(x = 100, y = 130)
- achievementMLabel.place(x = 100, y = 170)
- achievementELabel.place(x = 100, y = 210)
- #文本框控件位置
- idEntry.place(x = 300, y = 50)
- nameEntry.place(x = 300, y = 90)
- achievementCEntry.place(x = 300, y = 130)
- achievementMEntry.place(x = 300, y = 170)
- achievementEEntry.place(x = 300, y = 210)
- #按钮控件位置
- sure.place(x = 50, y = 280)
- back.place(x = 380, y = 280)
-
- addWindow.mainloop()
复制代码
【制作查看界面】 打开chat.py输入下列程序,该部分程序界面使用了按钮和表格控件,通过函数leading_in_content(text):导入文件相关数据到表格中。按钮控件分别实现了以总分从大到小,从小到大,及输入时间的排序。 导入函数: - def leading_in_content(text):#"""嵌套函数leading_in_content,用来导入单个文件,
-
- data = open('C:/Data/'+ text + '.txt',encoding="utf-8") # 拼接出完整的文件路径。
-
- _list = data.readlines() # 读取文件的所有内容。
-
- _list = _list[0].split(",") # 把读取的内容进行切片。
-
- del _list[-1] # 删除最后一个元素","。
-
- return _list
复制代码
排序函数: - def sortT():
-
- nameList, achievementCList, achievementMList, achievementEList, idList = leading_in_content() # 导入所有姓名,成绩,学号。
-
- students_group = [] # 定义学生组列表。
-
- for i in range(len(nameList)): # 通过for循环往学生组列表里添加student元组。
-
- student = (nameList[i], idList[i], int(achievementCList[i]), int(achievementMList[i]),int(achievementEList[i]))
-
- students_group.append(student)
-
- students_group = sorted(students_group, key=lambda x: x[2]+x[3]+x[4], reverse=True)
-
- # 通过sorted函数进行排序。
-
- x = tree.get_children()
-
- for item in x:
-
- tree.delete(item)
-
- for i in range(len(nameList)):
-
- student = students_group[i]
-
- tree.insert("", "end", values=(student[0], student[1], student[2], student[3], student[4]))
-
- tree.pack()
复制代码
【制作修改界面】 打开modiy.py输入下列程序,该部分程序界面使用了按钮和文本框控件,通过检测文本框中输入的数据姓名与列表中的姓名数据是否匹配从而判定是否对该条记录进行修改。(当然这里缺少对数据唯一性的判定!) - if(nameList[i] == nameEntry.get()):
-
- isTrue = True
-
- achievementCList[i] = achievementCEntry.get()
-
- achievementMList[i] = achievementMEntry.get()
-
- achievementEList[i] = achievementEEntry.get()
-
- idList[i] = idEntry.get()
-
- empty()
-
- for j in range(len(nameList)):
-
- data = open('C:/Data/Name.txt', "a", encoding="utf-8")
-
- data.write(nameList[j] + ',')
-
- data.close()
复制代码
【制作删除界面】 打开dele.py输入相关程序,该部分程序界面中使用了按钮和文本框控件,通过检测输入文本框中的数据,从而定位到需要删除的记录,实现单条记录删除。另外也可以使用清空按钮实现文件中所有数据的清空,但无论那种删除都是使用了empty.py中的删除函数具体如下: - def empty():"此函数的功能是清楚三个文件里的内容。"
-
- def __empty__(text):#
-
- """嵌套函数__empty__,用来删除单个文件。
-
- text表示要清除的文件名"""
-
- data = open('C:/Data/' + text + '.txt', "w", encoding="utf-8") # 拼接出完整的文件路径。
-
- data.write("") # 清除该文件内容。
-
- data.close() # 关闭该文件。
-
- return None
-
-
-
- __empty__("achievementC")
-
- __empty__("achievementM")
-
- __empty__("achievementE")
-
- __empty__("Name")
-
- __empty__("Id")
复制代码
|
NameError: name 'add' is not defined
从第一阶段就报错了,不知道什么原因
NameError: name 'nameList' is not defined