Python---학생 관리 시스템(pyinstaller)

칼럼: python
개인 홈페이지: HaiFan
칼럼 소개: 이 칼럼은 주로 파이썬에 대한 기본 지식을 업데이트하고 작은 게임, 주소록, 수업 시간 관리 시스템 등을 구현합니다.


머리말

특징

  1. 신입생
  2. 학생들에게 보여주다
  3. 학생 찾기
  4. 학생 삭제
  5. 문서에 저장

여기에 이미지 설명 삽입


항목 기능 만들기

입장 기능에서 먼저 메뉴를 인쇄하고 메뉴를 사용하여 상호 작용할 수 있습니다.

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

이러한 방식으로 학생 관리 시스템의 일반적인 프레임 워크입니다. 다음으로 옵션에 해당하는 기능을 구현합니다.

여기에 이미지 설명 삽입
프레임워크를 완료하면 시도해 볼 수 있습니다.

신입생 삽입

새 학생을 추가하려면 먼저 학생의 기본 정보를 입력해야 합니다.여기에서 전역 변수 목록과 지역 변수 사전을 얻을 수 있습니다.왜? 사전을 사용하면 학생의 모든 정보를 저장할 수 있기 때문에 목록의 각 요소가 사전이고 각 사전이 학생입니다.

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학생을 표시하는 기능은 아래와 같이 구현됩니다.

쇼 학생 쇼

학생이 학생을 통과해야 함을 보여줍니다.

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)}个学生')

변수는 메모리에 저장되기 때문에 프로그램이 종료되면 메모리의 데이터가 소멸되므로 프로그램을 실행할 때마다 정보를 다시 입력해야 합니다.
이 문제를 해결하기 위해 잠시 후에 데이터를 파일에 저장하겠습니다.

여기에 이미지 설명 삽입

학생 찾기찾기

여기서 학생 찾기 기능은 이름 검색을 예로 들겠습니다.
먼저 학생의 이름을 입력한 후 전역 변수 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}个匹配的同学')

여기에 이미지 설명 삽입

삭제 학생 삭제

이름으로 학생을 삭제하는 것은 이름으로 학생을 찾는 것과 유사하며 먼저 학생의 이름을 입력한 다음 전역 변수를 탐색합니다.

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 파일
에 저장되며 학생 정보는 Student
ID\ tName\tGender\tClass Student ID\tName\tGender\tClassStudent ID\
t 라인 텍스트 형식으로 저장됩니다.
\tclass
각 학생은 한 줄을 차지합니다.
\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는 목록을 지우는 데 사용됩니다.

파일을 읽으려면 먼저 파일을 확인하여 파일이 존재하는지 확인한 다음 파일의 내용을 순회하고 파일의 내용을 사전에 써야 합니다. 왜냐하면 사전은 목록의 요소이고 요소이기 때문입니다. 학생입니다. 전에 말했듯이 파일의 내용은 \t4로 나뉩니다.공백을 제거한 후 문자 split를 분할하는 데 사용할 .분할 후 분할 문자열 목록이 반환되므로 학생의 내용은 4개뿐이므로 그래서 우리는 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 프로그램으로 패키징됨

먼저 터미널을 열고,

여기에 이미지 설명 삽입
그런 다음 Enter를 pip install pyinstaller누르고 Enter를 누르면 다운로드가 시작됩니다.
이 이름을 입력할 때
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()

추천

출처blog.csdn.net/weixin_73888239/article/details/128770588