Python使用pyinstaller實(shí)現(xiàn)學(xué)生管理系統(tǒng)流程
前言
功能
- 新增學(xué)生
- 顯示學(xué)生
- 查找學(xué)生
- 刪除學(xué)生
- 存到文檔

創(chuàng)建入口函數(shù)
在入口函數(shù)中,可以先打印一個(gè)菜單,用菜單來(lái)進(jìn)行交互。
def menu():
print('1.新增學(xué)生')
print('2.顯示學(xué)生')
print('3.查找學(xué)生')
print('4.刪除學(xué)生')
print('0.退出程序')
光有菜單也不行,因?yàn)檩斎氲臄?shù)字要對(duì)應(yīng)菜單上的選項(xiàng)。所以可以在菜單里搞一個(gè)輸入和返回值,把輸入的值給返回,用一個(gè)變量接收。
def menu():
print('1.新增學(xué)生')
print('2.顯示學(xué)生')
print('3.查找學(xué)生')
print('4.刪除學(xué)生')
print('0.退出程序')
choice = input('請(qǐng)輸入您的選擇:')
return choice在根據(jù)菜單里的選項(xiàng)對(duì)應(yīng)一下需要實(shí)現(xiàn)的內(nèi)容。
這里可以用if-else-elif語(yǔ)句來(lái)完成。
ret = menu()
if ret == '1':
#新增學(xué)生
insert()
elif ret == '2':
#顯示學(xué)生
show()
elif ret == '3':
#查找學(xué)生
find()
elif ret == '4':
#刪除學(xué)生
del()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("輸入錯(cuò)誤,請(qǐng)重新輸入")
在調(diào)整學(xué)生信息的時(shí)候,肯定需要進(jìn)行多次更改,所以,要把上面的代碼放在循環(huán)里,當(dāng)用戶(hù)用完之后,輸入指定的數(shù)字或其他東西,才能退出。輸入錯(cuò)誤的時(shí)候,要讓用戶(hù)重新輸入。
while True:
#通過(guò)menu函數(shù)來(lái)打印除菜單
ret = menu()
if ret == '1':
#新增學(xué)生
insert()
elif ret == '2':
#顯示學(xué)生
show()
elif ret == '3':
#查找學(xué)生
find()
elif ret == '4':
#刪除學(xué)生
delete()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("輸入錯(cuò)誤,請(qǐng)重新輸入")
#進(jìn)入下次循環(huán),讓用戶(hù)重新輸入
continue
這樣,學(xué)生管理系統(tǒng)的大致框架。接下來(lái)把對(duì)應(yīng)選項(xiàng)的函數(shù)實(shí)現(xiàn)即可。

做完框架的時(shí)候,可以考慮運(yùn)行一下試試。
新增學(xué)生insert
要新增學(xué)生,就要先輸入學(xué)生的基本信息,在這里,可以弄一個(gè)全局變量的列表,和一個(gè)局部變量的字典,為什么呢?因?yàn)橛米值?,可以把學(xué)生的所有信息都存在里面,然后列表的每一個(gè)元素都是字典,每一個(gè)字典就是一個(gè)學(xué)生。
def insert():
StuId = input('請(qǐng)輸入學(xué)生的學(xué)號(hào):')
StuName = input('請(qǐng)輸入學(xué)生的姓名:')
StuGender = input('請(qǐng)輸入學(xué)生的性別:')
if StuGender not in ('男','女'):
print('性別輸入不符合的內(nèi)容不符合要求')
return
StuClass = input('請(qǐng)輸入學(xué)生的班級(jí):')
#使用一個(gè)字典把上述信息給聚合起來(lái)
StuDict = {
'StuId':StuId,
'StuName':StuName,
'StuGender':StuGender,
'StuClass':StuClass
}
global StuList
StuList.append(StuDict)
print('新增學(xué)生完畢')

這里,并不能看出新增的學(xué)生是否在列表里面,下面來(lái)實(shí)現(xiàn)show展示學(xué)生的函數(shù)。
展示學(xué)生show
展示學(xué)生只需要把學(xué)生遍歷即可
def show():
#遍歷全局變量的這個(gè)列表,把每個(gè)學(xué)生的信息給打印出來(lái)。
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'顯示學(xué)生完畢!共有{len(StuList)}個(gè)學(xué)生')
因?yàn)樽兞渴谴嬖趦?nèi)存中的,當(dāng)程序結(jié)束,內(nèi)存中的數(shù)據(jù)便會(huì)被銷(xiāo)毀,所以每次運(yùn)行程序都需要重新輸入信息。
為了解決這個(gè)問(wèn)題,一會(huì)我會(huì)把數(shù)據(jù)存儲(chǔ)在文件里。

查找學(xué)生find
查找學(xué)生的功能,在這里,以名字查找為例。
先輸入學(xué)生的名字,然后開(kāi)始遍歷全局變量StuList看是否有相匹配的同學(xué),若有:則打印出匹配同學(xué)的信息,若無(wú):則繼續(xù)遍歷,直到遍歷完畢,flag依舊為False,就輸出沒(méi)有找到與該姓名相匹配的同學(xué)。
def find():
name = input('請(qǐng)輸入要查找的同學(xué)的姓名')
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'沒(méi)有找到與該姓名相匹配的同學(xué)')
print(f'查找到了{(lán)cnt}個(gè)匹配的同學(xué)')

刪除學(xué)生delete
根據(jù)姓名刪除學(xué)生與根據(jù)姓名查找學(xué)生類(lèi)似,先把該學(xué)生的姓名輸入,然后對(duì)全局變量進(jìn)行遍歷即可
def delete():
name = input('請(qǐng)輸入要?jiǎng)h除學(xué)生的姓名')
flag = False
#看看這個(gè)要函數(shù)學(xué)生的姓名對(duì)應(yīng)列表中的哪個(gè)元素,把這個(gè)元素刪除了就好
for stu in StuList:
if name == stu['StuName']:
StuList.remove(stu)
flag = True
if not flag:
print('沒(méi)有找到該學(xué)生,請(qǐng)重新查找')
res = input('若不進(jìn)行刪除,則輸入1,退出刪除程序,輸入其他則重新刪除學(xué)生')
if res == '1':
pass
else:
delete()
#刪除之后學(xué)生的人數(shù)為
print(f'刪除之后學(xué)生的人數(shù)為{len(StuList)}')

加入存檔讀檔
約定文件放到D:/FileOperator/Stu.txt文件中
并且以行文本的方式來(lái)保存學(xué)生信息
學(xué)號(hào)\t名字\t性別\t班級(jí)
學(xué)號(hào)\t名字\t性別\t班級(jí)
學(xué)號(hào)\t名字\t性別\t班級(jí)
每個(gè)同學(xué)占一行.
每個(gè)同學(xué)的信息之間使用 \t 制表符進(jìn)行分隔
存檔
存檔就是把學(xué)生內(nèi)容,添加到一個(gè)文件里,這個(gè)操作就是一個(gè)遍歷,每次把學(xué)生加入即可。
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'存檔成功,共存儲(chǔ)了{(lán)len(StuList)}個(gè)記錄')

但是光有存檔,每次運(yùn)行的時(shí)候,展示學(xué)生,還是沒(méi)有之前添加學(xué)生的記錄,這是因?yàn)?,添加的學(xué)生在文件里,沒(méi)有寫(xiě)入讀入內(nèi)存。
讀檔
strip方法可以去掉一個(gè)字符串開(kāi)頭和末尾的空白符
空白符就是空格,換行,回車(chē),制表符等等
os.path.exists這個(gè)是用來(lái)檢測(cè)文件是否存在,以’r‘方式打開(kāi)文件,若文件不存在,則會(huì)拋出異常。
clear是用來(lái)清空列表的。
讀檔要先對(duì)文件進(jìn)行檢查,看文件是否存在,然后對(duì)文件中的內(nèi)容進(jìn)行遍歷,將文件的內(nèi)容寫(xiě)入到一個(gè)字典里,因?yàn)橐粋€(gè)字典就是一個(gè)列表的里的元素,一個(gè)元素就是一個(gè)學(xué)生。前面我們說(shuō)過(guò),文件里的內(nèi)容是用4個(gè)\t來(lái)分割的,在去除空白符之后,可以用split來(lái)拆分字符,拆分之后返回分割后的字符串列表,因?yàn)閷W(xué)生的內(nèi)容只要四個(gè),所以我們可以用一個(gè)元素來(lái)接收split的返回值,并判斷該元素是否有4個(gè),對(duì)此做出是否異常判斷。
def load():
"""
讀檔
"""
# 若文件不存在,則直接跳過(guò)讀檔流程
#為了避免讀方式打開(kāi)文件,文件不存在造成的拋出異常
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:
#針對(duì)這一行的數(shù)據(jù),按照\(chéng)t進(jìn)行切分操作
#卻分之前,取到文件里的換行
line = line.strip()
tokens = line.split('\t')
if len(tokens) != 4:
print(f'當(dāng)前行格式有問(wèn)題! line = {line}')
continue
StuDict = {
'StuId':tokens[0],
'StuName':tokens[1],
'StuGender':tokens[2],
'StuClass':tokens[3]
}
StuList.append(StuDict)
print('讀檔成功')


打包成exe程序發(fā)布
先打開(kāi)終端,

然后輸入pip install pyinstaller按回車(chē),然后就開(kāi)始下載了。
在輸入
pyinstaller -F StudentManagementSystem.py StudentManagementSystem.py這個(gè)名字我是對(duì)這個(gè)文件的命名,這個(gè)名字是要打包的文件名。

之后就會(huì)出來(lái)很多東西,不用搭理他,最后會(huì)在目錄里出現(xiàn)一個(gè)dist文件,點(diǎn)開(kāi)就是要打包的文件。



點(diǎn)開(kāi)這個(gè)exe文件也可以使用學(xué)生管理系統(tǒng)。
這樣就可以把這個(gè)程序拷貝給其他機(jī)器是用來(lái),無(wú)需Python環(huán)境即可運(yùn)行
代碼
"""
學(xué)生管理系統(tǒng)
珍惜在學(xué)校的時(shí)間。
"""
import sys
import os
#使用這個(gè)全局變量,來(lái)管理所有學(xué)生的信息
#表的每一個(gè)元素都是字典,每一個(gè)字典就是一個(gè)同學(xué)
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'存檔成功,共存儲(chǔ)了{(lán)len(StuList)}個(gè)記錄')
def load():
"""
讀檔
"""
# 若文件不存在,則直接跳過(guò)讀檔流程
#為了避免讀方式打開(kāi)文件,文件不存在造成的拋出異常
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:
#針對(duì)這一行的數(shù)據(jù),按照\(chéng)t進(jìn)行切分操作
#卻分之前,取到文件里的換行
line = line.strip()
tokens = line.split('\t')
if len(tokens) != 4:
print(f'當(dāng)前行格式有問(wèn)題! line = {line}')
continue
StuDict = {
'StuId':tokens[0],
'StuName':tokens[1],
'StuGender':tokens[2],
'StuClass':tokens[3]
}
StuList.append(StuDict)
print('讀檔成功')
def menu():
print('1.新增學(xué)生')
print('2.顯示學(xué)生')
print('3.查找學(xué)生')
print('4.刪除學(xué)生')
print('0.退出程序')
choice = input('請(qǐng)輸入您的選擇:')
return choice
def insert():
StuId = input('請(qǐng)輸入學(xué)生的學(xué)號(hào):')
StuName = input('請(qǐng)輸入學(xué)生的姓名:')
StuGender = input('請(qǐng)輸入學(xué)生的性別:')
if StuGender not in ('男','女'):
print('性別輸入不符合的內(nèi)容不符合要求')
return
StuClass = input('請(qǐng)輸入學(xué)生的班級(jí):')
#使用一個(gè)字典把上述信息給聚合起來(lái)
StuDict = {
'StuId':StuId,
'StuName':StuName,
'StuGender':StuGender,
'StuClass':StuClass
}
global StuList
StuList.append(StuDict)
save()
print('新增學(xué)生完畢')
def show():
#遍歷全局變量的這個(gè)列表,把每個(gè)學(xué)生的信息給打印出來(lái)。
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'顯示學(xué)生完畢!共有{len(StuList)}個(gè)學(xué)生')
def find():
name = input('請(qǐng)輸入要查找的同學(xué)的姓名')
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'沒(méi)有找到與該姓名相匹配的同學(xué)')
print(f'查找到了{(lán)cnt}個(gè)匹配的同學(xué)')
def delete():
name = input('請(qǐng)輸入要?jiǎng)h除學(xué)生的姓名')
flag = False
#看看這個(gè)要函數(shù)學(xué)生的姓名對(duì)應(yīng)列表中的哪個(gè)元素,把這個(gè)元素刪除了就好
for stu in StuList:
if name == stu['StuName']:
StuList.remove(stu)
flag = True
if not flag:
print('沒(méi)有找到該學(xué)生,請(qǐng)重新查找')
res = input('若不進(jìn)行刪除,則輸入1,退出刪除程序,輸入其他則重新刪除學(xué)生')
if res == '1':
pass
else:
delete()
save()
#刪除之后學(xué)生的人數(shù)為
print(f'刪除之后學(xué)生的人數(shù)為{len(StuList)}')
def main():
"""
入口函數(shù)
"""
#通過(guò)控制臺(tái)和用戶(hù)進(jìn)行交互
print('----------------------------------------')
print('| 歡迎來(lái)到學(xué)生管理系統(tǒng) |')
print('----------------------------------------')
load()
while True:
#通過(guò)menu函數(shù)來(lái)打印除菜單
ret = menu()
if ret == '1':
#新增學(xué)生
insert()
elif ret == '2':
#顯示學(xué)生
show()
elif ret == '3':
#查找學(xué)生
find()
elif ret == '4':
#刪除學(xué)生
delete()
elif ret == '0':
#退出程序
print('bye bye')
sys.exit(0)
else:
print("輸入錯(cuò)誤,請(qǐng)重新輸入")
#進(jìn)入下次循環(huán),讓用戶(hù)重新輸入
continue
main()到此這篇關(guān)于Python使用pyinstaller實(shí)現(xiàn)學(xué)生管理系統(tǒng)流程的文章就介紹到這了,更多相關(guān)Python學(xué)生管理系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)現(xiàn)一個(gè)完整學(xué)生管理系統(tǒng)
- 基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的學(xué)生管理系統(tǒng)
- 基于Python實(shí)現(xiàn)面向?qū)ο蟀鎸W(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)功能全面的學(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)并生成exe可執(zhí)行文件詳解流程
- 一篇文章教你用Python實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο蟀?
- python實(shí)現(xiàn)學(xué)生管理系統(tǒng)源碼
相關(guān)文章
最新tensorflow與pytorch環(huán)境搭建的實(shí)現(xiàn)步驟
深度學(xué)習(xí)相關(guān)的熱門(mén)框架主要為T(mén)ensorflow和Pytorch,本文主要介紹了搭建最新tensorflow與pytorch環(huán)境,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
Python數(shù)據(jù)結(jié)構(gòu)之雙向鏈表詳解
單鏈表只有一個(gè)指向直接后繼的指針來(lái)表示結(jié)點(diǎn)間的邏輯關(guān)系,可以方便的從任一結(jié)點(diǎn)開(kāi)始查找其后繼結(jié)點(diǎn),但要找前驅(qū)結(jié)點(diǎn)則比較困難,雙向鏈表是為了解決這一問(wèn)題,使用兩個(gè)指針表示結(jié)點(diǎn)間的邏輯關(guān)系。本文將重點(diǎn)為大家介紹雙向鏈表的相關(guān)操作,需要的可以參考一下2022-01-01
Python異常對(duì)象Exception基礎(chǔ)類(lèi)異常捕捉
這篇文章主要為大家介紹了Python異常對(duì)象異常捕捉及Exception基礎(chǔ)類(lèi),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
利用Python實(shí)現(xiàn)讀取照片的Exif信息
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)讀取照片的Exif信息,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,有需要的小伙伴可以參考下2023-10-10
Flask之pipenv虛擬環(huán)境的實(shí)現(xiàn)
這篇文章主要介紹了Flask之pipenv虛擬環(huán)境的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Python讀寫(xiě)文件基礎(chǔ)知識(shí)點(diǎn)
在本篇文章中小編給大家整理了關(guān)于Python讀寫(xiě)文件的基礎(chǔ)知識(shí)內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。2019-06-06

