Python --- 学生管理システム (pyinstaller)

コラム: python
個人ホームページ: HaiFan.
コラムの紹介: このコラムは、主に python の基本的な知識を更新し、いくつかの小さなゲーム、アドレス帳、授業時間管理システムなどを実装しています. 興味のある友達は注意を払うことができます.


序文

特徴

  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ファイルに配置され
、学生情報は行テキストの形式で保存されます \tクラス各生徒は 1 行を占めます。\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プログラムにパッケージ化

まずターミナルを開き、

ここに画像の説明を挿入
次に、入力してpip install pyinstallerEnterキーを押すと、ダウンロードが開始されます.
この名前を入力する
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