Python使用pyinstaller实现学生管理系统流程
作者:HaiFan. 发布时间:2023-05-25 02:58:05
前言
功能
新增学生
显示学生
查找学生
删除学生
存到文档
创建入口函数
在入口函数中,可以先打印一个菜单,用菜单来进行交互。
def menu():
print('1.新增学生')
print('2.显示学生')
print('3.查找学生')
print('4.删除学生')
print('0.退出程序')
光有菜单也不行,因为输入的数字要对应菜单上的选项。所以可以在菜单里搞一个输入和返回值,把输入的值给返回,用一个变量接收。
def menu():
print('1.新增学生')
print('2.显示学生')
print('3.查找学生')
print('4.删除学生')
print('0.退出程序')
choice = input('请输入您的选择:')
return choice
在根据菜单里的选项对应一下需要实现的内容。
这里可以用if-else-elif
语句来完成。
ret = menu()
if ret == '1':
#新增学生
insert()
elif ret == '2':
#显示学生
show()
elif ret == '3':
#查找学生
find()
elif ret == '4':
#删除学生
del()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("输入错误,请重新输入")
在调整学生信息的时候,肯定需要进行多次更改,所以,要把上面的代码放在循环里,当用户用完之后,输入指定的数字或其他东西,才能退出。输入错误的时候,要让用户重新输入。
while True:
#通过menu函数来打印除菜单
ret = menu()
if ret == '1':
#新增学生
insert()
elif ret == '2':
#显示学生
show()
elif ret == '3':
#查找学生
find()
elif ret == '4':
#删除学生
delete()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("输入错误,请重新输入")
#进入下次循环,让用户重新输入
continue
这样,学生管理系统的大致框架。接下来把对应选项的函数实现即可。
做完框架的时候,可以考虑运行一下试试。
新增学生insert
要新增学生,就要先输入学生的基本信息,在这里,可以弄一个全局变量的列表,和一个局部变量的字典,为什么呢?因为用字典,可以把学生的所有信息都存在里面,然后列表的每一个元素都是字典,每一个字典就是一个学生。
def insert():
StuId = input('请输入学生的学号:')
StuName = input('请输入学生的姓名:')
StuGender = input('请输入学生的性别:')
if StuGender not in ('男','女'):
print('性别输入不符合的内容不符合要求')
return
StuClass = input('请输入学生的班级:')
#使用一个字典把上述信息给聚合起来
StuDict = {
'StuId':StuId,
'StuName':StuName,
'StuGender':StuGender,
'StuClass':StuClass
}
global StuList
StuList.append(StuDict)
print('新增学生完毕')
这里,并不能看出新增的学生是否在列表里面,下面来实现show
展示学生的函数。
展示学生show
展示学生只需要把学生遍历即可
def show():
#遍历全局变量的这个列表,把每个学生的信息给打印出来。
print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}')
for stu in StuList:
print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}')
print(f'显示学生完毕!共有{len(StuList)}个学生')
因为变量是存在内存中的,当程序结束,内存中的数据便会被销毁,所以每次运行程序都需要重新输入信息。
为了解决这个问题,一会我会把数据存储在文件里。
查找学生find
查找学生的功能,在这里,以名字查找为例。
先输入学生的名字,然后开始遍历全局变量StuList
看是否有相匹配的同学,若有:则打印出匹配同学的信息,若无:则继续遍历,直到遍历完毕,flag依旧为False,就输出没有找到与该姓名相匹配的同学。
def find():
name = input('请输入要查找的同学的姓名')
cnt = 0
flag = False
print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}')
for stu in StuList:
if name == stu['StuName']:
print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}')
cnt += 1
flag = True
if not flag:
print(f'没有找到与该姓名相匹配的同学')
print(f'查找到了{cnt}个匹配的同学')
删除学生delete
根据姓名删除学生与根据姓名查找学生类似,先把该学生的姓名输入,然后对全局变量进行遍历即可
def delete():
name = input('请输入要删除学生的姓名')
flag = False
#看看这个要函数学生的姓名对应列表中的哪个元素,把这个元素删除了就好
for stu in StuList:
if name == stu['StuName']:
StuList.remove(stu)
flag = True
if not flag:
print('没有找到该学生,请重新查找')
res = input('若不进行删除,则输入1,退出删除程序,输入其他则重新删除学生')
if res == '1':
pass
else:
delete()
#删除之后学生的人数为
print(f'删除之后学生的人数为{len(StuList)}')
加入存档读档
约定文件放到D:/FileOperator/Stu.txt文件中
并且以行文本的方式来保存学生信息
学号\t名字\t性别\t班级
学号\t名字\t性别\t班级
学号\t名字\t性别\t班级
每个同学占一行.
每个同学的信息之间使用 \t 制表符进行分隔
存档
存档就是把学生内容,添加到一个文件里,这个操作就是一个遍历,每次把学生加入即可。
def save():
"""
用于存档
"""
with open('d:/FileOperator/Stu.txt','w',encoding = 'UTF8') as f:
for s in StuList:
f.write(f"{s['StuId']}\t{s['StuName']}\t{s['StuGender']}\t{s['StuClass']}\n")
print(f'存档成功,共存储了{len(StuList)}个记录')
但是光有存档,每次运行的时候,展示学生,还是没有之前添加学生的记录,这是因为,添加的学生在文件里,没有写入读入内存。
读档
strip方法可以去掉一个字符串开头和末尾的空白符
空白符就是空格,换行,回车,制表符等等
os.path.exists这个是用来检测文件是否存在,以’r‘方式打开文件,若文件不存在,则会抛出异常。
clear是用来清空列表的。
读档要先对文件进行检查,看文件是否存在,然后对文件中的内容进行遍历,将文件的内容写入到一个字典里,因为一个字典就是一个列表的里的元素,一个元素就是一个学生。前面我们说过,文件里的内容是用4个\t
来分割的,在去除空白符之后,可以用split
来拆分字符,拆分之后返回分割后的字符串列表,因为学生的内容只要四个,所以我们可以用一个元素来接收split的返回值,并判断该元素是否有4个,对此做出是否异常判断。
def load():
"""
读档
"""
# 若文件不存在,则直接跳过读档流程
#为了避免读方式打开文件,文件不存在造成的抛出异常
if not os.path.exists('d:/FileOperator/Stu.txt'):
return
global StuList
StuList.clear()
with open('d:/FileOperator/Stu.txt','r',encoding = 'UTF8') as f:
for line in f:
#针对这一行的数据,按照\t进行切分操作
#却分之前,取到文件里的换行
line = line.strip()
tokens = line.split('\t')
if len(tokens) != 4:
print(f'当前行格式有问题! line = {line}')
continue
StuDict = {
'StuId':tokens[0],
'StuName':tokens[1],
'StuGender':tokens[2],
'StuClass':tokens[3]
}
StuList.append(StuDict)
print('读档成功')
打包成exe程序发布
先打开终端,
然后输入pip install pyinstaller
按回车,然后就开始下载了。
在输入
pyinstaller -F StudentManagementSystem.py
StudentManagementSystem.py
这个名字我是对这个文件的命名,这个名字是要打包的文件名。
之后就会出来很多东西,不用搭理他,最后会在目录里出现一个dist
文件,点开就是要打包的文件。
点开这个exe文件也可以使用学生管理系统。
这样就可以把这个程序拷贝给其他机器是用来,无需Python环境即可运行
代码
"""
学生管理系统
珍惜在学校的时间。
"""
import sys
import os
#使用这个全局变量,来管理所有学生的信息
#表的每一个元素都是字典,每一个字典就是一个同学
StuList = []
def save():
"""
用于存档
"""
with open('d:/FileOperator/Stu.txt','w',encoding = 'UTF8') as f:
for s in StuList:
f.write(f"{s['StuId']}\t{s['StuName']}\t{s['StuGender']}\t{s['StuClass']}\n")
print(f'存档成功,共存储了{len(StuList)}个记录')
def load():
"""
读档
"""
# 若文件不存在,则直接跳过读档流程
#为了避免读方式打开文件,文件不存在造成的抛出异常
if not os.path.exists('d:/FileOperator/Stu.txt'):
return
global StuList
StuList.clear()
with open('d:/FileOperator/Stu.txt','r',encoding = 'UTF8') as f:
for line in f:
#针对这一行的数据,按照\t进行切分操作
#却分之前,取到文件里的换行
line = line.strip()
tokens = line.split('\t')
if len(tokens) != 4:
print(f'当前行格式有问题! line = {line}')
continue
StuDict = {
'StuId':tokens[0],
'StuName':tokens[1],
'StuGender':tokens[2],
'StuClass':tokens[3]
}
StuList.append(StuDict)
print('读档成功')
def menu():
print('1.新增学生')
print('2.显示学生')
print('3.查找学生')
print('4.删除学生')
print('0.退出程序')
choice = input('请输入您的选择:')
return choice
def insert():
StuId = input('请输入学生的学号:')
StuName = input('请输入学生的姓名:')
StuGender = input('请输入学生的性别:')
if StuGender not in ('男','女'):
print('性别输入不符合的内容不符合要求')
return
StuClass = input('请输入学生的班级:')
#使用一个字典把上述信息给聚合起来
StuDict = {
'StuId':StuId,
'StuName':StuName,
'StuGender':StuGender,
'StuClass':StuClass
}
global StuList
StuList.append(StuDict)
save()
print('新增学生完毕')
def show():
#遍历全局变量的这个列表,把每个学生的信息给打印出来。
print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}')
for stu in StuList:
print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}')
print(f'显示学生完毕!共有{len(StuList)}个学生')
def find():
name = input('请输入要查找的同学的姓名')
cnt = 0
flag = False
print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}')
for stu in StuList:
if name == stu['StuName']:
print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}')
cnt += 1
flag = True
if not flag:
print(f'没有找到与该姓名相匹配的同学')
print(f'查找到了{cnt}个匹配的同学')
def delete():
name = input('请输入要删除学生的姓名')
flag = False
#看看这个要函数学生的姓名对应列表中的哪个元素,把这个元素删除了就好
for stu in StuList:
if name == stu['StuName']:
StuList.remove(stu)
flag = True
if not flag:
print('没有找到该学生,请重新查找')
res = input('若不进行删除,则输入1,退出删除程序,输入其他则重新删除学生')
if res == '1':
pass
else:
delete()
save()
#删除之后学生的人数为
print(f'删除之后学生的人数为{len(StuList)}')
def main():
"""
入口函数
"""
#通过控制台和用户进行交互
print('----------------------------------------')
print('| 欢迎来到学生管理系统 |')
print('----------------------------------------')
load()
while True:
#通过menu函数来打印除菜单
ret = menu()
if ret == '1':
#新增学生
insert()
elif ret == '2':
#显示学生
show()
elif ret == '3':
#查找学生
find()
elif ret == '4':
#删除学生
delete()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("输入错误,请重新输入")
#进入下次循环,让用户重新输入
continue
main()
来源:https://blog.csdn.net/weixin_73888239/article/details/128770588


猜你喜欢
- 效果如下所示简介在当今信息时代,金融市场是一个引人注目的话题。作为普通人,我们也可以通过使用 Python 和 wxPython 库编写一个
- 本文实例讲述了Python基于PyGraphics包实现图片截取功能的方法。分享给大家供大家参考,具体如下:先安安装PyGraphics包
- networkx返回图的邻接矩阵最近有用到关于邻接矩阵的一些问题,平时不太常用所以一直没注意到networkx里面的函数,权当笔记了,有兴趣
- canny边缘检测原理canny边缘检测共有5部分组成,下边我会分别来介绍。1 高斯模糊(略)2 计算梯度幅值和方向。可选用的模板:sobl
- 本博客演示使用OpenCV和PIL读取和显示图像的差异。首先来看一下原始的bgr图像 src.jpg1. 使用cv2读取src.jpg并转为
- 一、前端工具vscode1.1、概述前端开发是创建Web页面或app等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以
- 线程池线程池的创建 - concurrentconcurrent 是 Python 的内置包,使用它可以帮助我们完成创建线程池的任
- HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式
- 实现效果完整代码+详细注释<template> <div class="echart"&g
- 我就废话不多说了,大家还是直接看代码吧!import requestsimport jsonraw = {}headers中添加上conte
- 本文实例为大家分享了python实现二维数组的对角线遍历,供大家参考,具体内容如下第一种情况:从左上角出发,右下角结束要完成的事情,就像下图
- 属性(attribute):R中对象具备的特性特性描述了所代表的内容以及R解释该对象的方式很多时候两个对象之间的唯一差别在于它们的属性不同常
- PyCharm安装配置Qt Designer+PyUIC教程1、安装依赖命令形式pip install PyQt5pip install p
- 项目我采用了三层结构,我把LINQ的映射文件放到了DAL这个层中,映射文件自动由VS2008生成,在原来的机器上一直正常,一点问题都没有,当
- 一、复制的原理MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录
- 引子例如,一个人可能会在计算机上存储大量的照片、视频和文档文件,这些文件可能散落在不同的文件夹中,难以管理和查找。该程序可以根据文件类型将这
- python中捕获键盘操作一共有两种方法第一种方法:使用pygame中event方法使用方式如下:使用键盘右键为例if event.type
- eWebEditor编辑器按钮失效,IE8下eWebEditor编辑器无法使用问题解决方法有两个,一个是下面的方法通过修改js文件,其实我们
- 本文先了解一个简单阈值函数,以了解一个阈值算法的具体参数。 然后比较不同阈值函数的区别。同样的,先用一副图说明本文重要大纲: #! usr/
- 第一种:import socket import fcntl import struct def get_ip_address(ifname