關(guān)于“學(xué)生信息管理系統(tǒng)”的基本思路和詳細(xì)過程,請(qǐng)看V1.0版本:
Python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)V1.0_︶ㄣ釋然的博客-CSDN博客本文是關(guān)于學(xué)生信息管理系統(tǒng)的簡(jiǎn)易版以及具體內(nèi)容具體思路的詳細(xì)講解,簡(jiǎn)單易理解、純邏輯實(shí)現(xiàn)、沒有復(fù)雜的第三方庫,適合新手小白練手https://blog.csdn.net/qq_60735796/article/details/125648838
關(guān)于“學(xué)生信息管理系統(tǒng)”的非GUI進(jìn)階版本,請(qǐng)看V2.0版本:
Python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)V2.0(讀寫文件操作)_︶ㄣ釋然的博客-CSDN博客本文是關(guān)于學(xué)生信息管理系統(tǒng)的“進(jìn)階”,引入了文件句柄操作txt文件(讀取和寫入學(xué)生信息)https://blog.csdn.net/qq_60735796/article/details/125649281下面是GUI界面的V3.0版本,同時(shí)包含學(xué)生信息的寫入文件。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-486425.html
先給大家展示的是GUI可視化的大致實(shí)現(xiàn)思路
?文章來源:http://www.zghlxwxcb.cn/news/detail-486425.html
本程序的GUI界面可視化是使用了python的tkinter庫(下面稱thinter為tk)
①下面介紹如何初始化GUI界面
界面主要是使用了tk.label 和 tk.entry(代碼即注釋)
# 關(guān)于gui的代碼, 用方法封裝比較困難,
# 此處利用if __name__ == '__main__' , 方便代碼折疊, ”閱讀”全局思路
if __name__ == '__main__':
# 以下代碼全部為gui界面的初始化
# 第1步,實(shí)例化對(duì)象,建立窗口window
window = tk.Tk()
# 第2步,給窗口的可視化起名字
window.title('學(xué)生信息管理系統(tǒng) V6.1') # 學(xué)生信息管理系統(tǒng)6 - 1
# 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬)
window.geometry('500x650')
# tk.StringVar()用于接收用戶輸入
result = tk.StringVar()
result.set(" ")
# ①關(guān)于姓名的 label 和 entry
textName = tk.StringVar()
textName.set("")
labelLine1 = tk.Label(window, text="姓 名:", font=('Arial', 15), width=10).place(x=75, y=50, anchor='nw')
entryLine1 = tk.Entry(window, show=None, font=('宋體', 15), textvariable=textName, width=20)
entryLine1.place(x=190, y=50, anchor='nw') # 顯示成明文形式
# ②關(guān)于性別的 label 和 entry
textSex = tk.StringVar()
textSex.set("")
labelLine2 = tk.Label(window, text="性 別:", font=('Arial', 15), width=10)
labelLine2.place(x=75, y=100, anchor='nw')
entryLine2 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textSex, width=18)
entryLine2.place(x=190, y=100, anchor='nw')
# ③關(guān)于電話的 label 和 entry
textPhone = tk.StringVar()
textPhone.set("")
labelLine3 = tk.Label(window, text="電 話:", font=('Arial', 15), width=10).place(x=75, y=150, anchor='nw')
entryLine3 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textPhone, width=18)
entryLine3.place(x=190, y=150, anchor='nw')
# 關(guān)于"添加"組件,此處綁定函數(shù)addStudentsMessage()用于添加學(xué)生信息
button1_add = tk.Button(window, text='添 加', bg='silver', font=('Arial', 12), command=addStudentsMessage, width=8)
button1_add.place(x=40, y=220, anchor='nw')
# 關(guān)于"刪除"組件,此處綁定函數(shù)deleteMessage()用于刪除學(xué)生信息
button2_delete = tk.Button(window, text='刪 除', bg='silver', font=('Arial', 12), command=deleteMessage, width=8)
button2_delete.place(x=150, y=220, anchor='nw')
# 關(guān)于"修改"組件,此處綁定函數(shù)change()用于修改學(xué)生信息
button3_change = tk.Button(window, text='修 改', bg='silver', font=('Arial', 12), command=change, width=8)
button3_change.place(x=260, y=220, anchor='nw')
# 關(guān)于"顯示"組件,此處綁定函數(shù)show()用于顯示學(xué)生信息
button4_show = tk.Button(window, text='顯 示', bg='silver', font=('Arial', 12), command=show, width=8)
button4_show.place(x=370, y=220, anchor='nw')
# 下邊兩行代碼是在gui界面顯示我的學(xué)號(hào)和姓名
labelLine_Name = tk.Label(window, text="許梓璘", font=('宋體', 13), width=10).place(x=130, y=260, anchor='nw')
labelLine_myID = tk.Label(window, text="2109059342", font=('宋體', 13), width=10).place(x=250, y=260, anchor='nw')
show_result = tk.Label(window, bg="white", fg="black", font=("宋體", 12), bd='0', anchor='nw', textvariable=result)
show_result.place(x="25", y="300", width="450", height="300")
window.mainloop()
?
②實(shí)現(xiàn)可視化之后,原來V1.0和V2.0版本輸出(print)的提示信息和獲取用戶輸入(input),不再適用,此時(shí)要采用tk.StringVar().set()設(shè)置GUI界面的文本框展示信息以及tk.StringVar().get()獲取用戶在GUI界面輸入的文本內(nèi)容
(注意此處獲取到的文本內(nèi)容,均為StringVar類型而并非String,這是不可變數(shù)據(jù)類型),其余實(shí)現(xiàn)思路均類似于V2.0版本(此處以“修改學(xué)生信息”功能為例)
# 3、修改學(xué)生信息
def change():
if LIST is None:
result.set("沒有信息,無法修改")
return None
if len(LIST) == 0:
result.set("沒有信息,無法修改")
return None
if len(LIST) != 0:
inputName = textName.get()
for i in range(0, len(LIST)):
if LIST[i]["name"] == inputName:
LIST[i]["sex"] = textSex.get()
LIST[i]["phone"] = textSex.get()
writeTxt_wMode(LIST)
result.set("修改成功")
delete_Gui_StudentMessage()
return
?
③展示GUI界面實(shí)現(xiàn)結(jié)果
?
?
最后,附上完整代碼,其中附有詳細(xì)注釋:
# -*- coding: utf-8 -*-
# @Author:︶ㄣ釋然
# @Time: 2022/7/6 22:08
import tkinter as tk
# 定義一個(gè)全局變量接收學(xué)生信息并進(jìn)行更新
LIST = []
# 定義一個(gè)方法用于使用w模式寫入文件:傳入已經(jīng)存好變更好信息的列表,然后遍歷寫入txt文檔
def writeTxt_wMode(studentList):
# w:只寫入模式,文件不存在則建立,將文件里邊的內(nèi)容先刪除再寫入
with open("test.txt", "w", encoding="utf-8") as f:
for i in range(0, len(studentList)):
DICT = studentList[i]
if i == len(studentList) - 1:
f.write("{0}\t{1}\t{2}".format(DICT["name"], DICT["sex"], DICT["phone"]))
else:
f.write("{0}\t{1}\t{2}\n".format(DICT["name"], DICT["sex"], DICT["phone"]))
# 定義一個(gè)方法用于讀取文件:
def readTxt() -> list:
emptyList1 = []
emptyList2 = []
# 打開同目錄下的txt文件
f = open("./test.txt", 'r', encoding='UTF-8')
# 把txt文件中的每一行學(xué)生信息,存儲(chǔ)為新列表emptyList1的元素,
for i in f:
a = str(i)
b = a.replace('\n', '')
emptyList1.append(b.split("\t"))
# 依次將emptyList的三種學(xué)生信息字典,存入列表
while len(emptyList2) < len(emptyList1):
for j in range(0, len(emptyList1)):
name = emptyList1[j][0]
sex = emptyList1[j][1]
phone = emptyList1[j][2]
Dict = {"name": name, "sex": sex, "phone": phone}
# 把該字典作為emptyList2的一個(gè)元素,依次存入。
emptyList2.append(Dict)
f.close()
# 最后結(jié)束方法,返回存儲(chǔ)信息完成的列表
return emptyList2
# 定義一個(gè)方法,檢查輸入的電話號(hào)碼是否符合規(guī)范,返回布爾值
def checkPhoneNumber_Boolean(phone):
if phone.isdigit():
return True
else:
result.set("電話號(hào)碼輸入不是純數(shù)字")
return False
# 定義一個(gè)方法,去除字符串左右兩端的空格,并返回處理之后的字符串
def trim(strings):
# 獲取從偏移為0的字符一直到偏移為1的字符串,不包括偏移為1的字符串
# (該功能用于去除字符串左邊的空格)
while strings[:1] == ' ':
strings = strings[1:]
# 獲取從偏移為-1的字符一直到偏移為最后一位的字符串,不包括偏移為最后一位的字符串
# (該功能用于去除字符串右邊的空格)
while strings[-1:] == ' ':
strings = strings[:-1]
# 左右兩端空格去除完成,返回strings
return strings
# 定義方法查找同名
def checkTheSameName(enterName):
flagList = [] # 存的是名字的索引
List = []
returnList = []
date = 1
# 開始遍歷查找
for i in range(0, len(LIST)):
if LIST[i]["name"] == enterName:
# 把找到的名字對(duì)應(yīng)的索引,添加進(jìn)列表
flagList.append(int(i))
if len(flagList) == 1:
# 說明信息中只存在一個(gè)這樣的名字
return date # 返回1表示不重名
if len(flagList) > 1:
for i in flagList:
List.append(LIST[i])
# 此時(shí),List的長(zhǎng)度等于flagList
returnList.append(List)
returnList.append(flagList)
return returnList # 第一個(gè)元素是列表,第二個(gè)元素是存儲(chǔ)重復(fù)名字的索引的 列表
# 定義方法顯示所有重復(fù)的學(xué)生信息
def show_ofTheSameName(list_ofTheSameName):
# 定義一個(gè)字符串用于存儲(chǔ)想要輸出顯示的內(nèi)容
str_out = ""
str_out += "出現(xiàn)同名,同名學(xué)生信息顯示如下:\n"
# 打印頭部標(biāo)題 并進(jìn)行格式化
str_out += ("{:^9}".format("學(xué)生序號(hào)") +
"{:^9}".format("學(xué)生姓名") +
"{:^9}".format("學(xué)生性別") +
"{:^11}".format("電話號(hào)碼") +
"\n")
for i in range(0, len(list_ofTheSameName)):
# 格式化字符串
str_out += ("{:<11}".format(i + 1, chr(12288)) +
"{:<11}".format(list_ofTheSameName[i].get("name"), chr(12288)) +
"{:^9}".format(list_ofTheSameName[i].get("sex"), chr(12288)) +
"{:>15}".format(list_ofTheSameName[i].get("phone"), chr(12288)) +
"\n")
str_out += "\n請(qǐng)?jiān)谏戏捷斎朐敿?xì)學(xué)生信息,進(jìn)行精準(zhǔn)刪除"
result.set(str_out)
# 定義方法清除gui界面的三個(gè)學(xué)生信息
def delete_Gui_StudentMessage():
textName.set("")
textSex.set("")
textPhone.set("")
# 1、添加學(xué)生信息
def addStudentsMessage():
# 在gui界面輸入的學(xué)生姓名,使用get()方法,獲取entry中輸入的內(nèi)容
# 并且用name接收
name = textName.get()
# 判斷是否為空,并在gui界面進(jìn)行提示
if not name:
result.set("學(xué)生姓名不能為空")
return
# 調(diào)用自定義的方法,去除字符串兩端的空格再進(jìn)行比較,如果去除空格之后為空,則說明鍵入的字符串只有空格
if trim(name) == "":
result.set("學(xué)生姓名不能為空")
return
# 判斷性別輸入是否正確
# 在gui界面輸入的學(xué)生性別,使用get()方法,獲取entry中輸入的內(nèi)容
# 并且用sex接收
sex = textSex.get()
if sex == "F" or sex == "M":
pass
else:
# 如果輸入的性別不符合規(guī)范,則在gui界面進(jìn)行提示
result.set("性別輸入格式有誤")
return
# 判斷電話輸入是否正確
# 在gui界面輸入的學(xué)生電話號(hào)碼,使用get()方法,獲取entry中輸入的內(nèi)容
# 并且用phone接收
phone = textPhone.get()
# 調(diào)用自定義的檢查方法,返回布爾類型,如果符合要求,則返回True
resultBoolean = checkPhoneNumber_Boolean(phone)
if resultBoolean:
pass
else:
return
Dict = {"name": name, "sex": sex, "phone": phone}
LIST.append(Dict)
result.set("學(xué)生已添加")
# 調(diào)用自定義方法清除gui界面的學(xué)生信息
delete_Gui_StudentMessage()
writeTxt_wMode(LIST)
return
# 2、刪除學(xué)生信息
def deleteMessage() -> list:
# 定義信號(hào)位
flag = True
enterName = textName.get()
for i in range(0, len(LIST)):
if LIST[i]["name"] == enterName:
flag = False
break
if flag:
result.set("學(xué)生不存在")
# 學(xué)生不存在則沒有必要查找是否同名
return LIST
# 開始遍歷查找
accept = checkTheSameName(enterName) # 接收查找同名方法的返回值
if accept == 1:
for i in range(0, len(LIST)):
if LIST[i]["name"] == enterName:
del LIST[i]
result.set("刪除成功")
writeTxt_wMode(LIST)
delete_Gui_StudentMessage()
# 刪除成功直接返回,結(jié)束該方法
return
else:
# 此時(shí)出現(xiàn)同名,accept[0]和accept[1]都是列表對(duì)象
# accept[0]存儲(chǔ)的是同名學(xué)生信息
show_ofTheSameName(accept[0])
for i in range(0, len(LIST)):
if LIST[i]["name"] == textName.get():
if LIST[i]["sex"] == textSex.get():
if LIST[i]["phone"] == textPhone.get():
del LIST[i]
result.set("刪除成功")
writeTxt_wMode(LIST)
delete_Gui_StudentMessage()
return
# 3、修改學(xué)生信息
def change():
if LIST is None:
result.set("沒有信息,無法修改")
return None
if len(LIST) == 0:
result.set("沒有信息,無法修改")
return None
if len(LIST) != 0:
inputName = textName.get()
for i in range(0, len(LIST)):
if LIST[i]["name"] == inputName:
LIST[i]["sex"] = textSex.get()
LIST[i]["phone"] = textSex.get()
writeTxt_wMode(LIST)
result.set("修改成功")
delete_Gui_StudentMessage()
return
# 4、顯示所有學(xué)生信息
def show():
# 定義一個(gè)字符串用于存儲(chǔ)想要輸出顯示的內(nèi)容
str_out = ""
if LIST is None:
result.set("無學(xué)生信息")
return
if len(LIST) == 0:
result.set("無學(xué)生信息")
return
if len(LIST) != 0:
str_out += "學(xué)生信息如下:\n"
# 打印頭部標(biāo)題 并進(jìn)行格式化
str_out += ("{:^9}".format("學(xué)生序號(hào)") +
"{:^9}".format("學(xué)生姓名") +
"{:^9}".format("學(xué)生性別") +
"{:^11}".format("電話號(hào)碼") +
"\n")
for i in range(0, len(LIST)):
# 格式化字符串
str_out += ("{:<11}".format(i + 1, chr(12288)) +
"{:<11}".format(LIST[i].get("name"), chr(12288)) +
"{:^9}".format(LIST[i].get("sex"), chr(12288)) +
"{:>15}".format(LIST[i].get("phone"), chr(12288)) +
"\n")
# 在gui界面更新顯示最新的字符串str
result.set(str_out)
# 把文件里邊的學(xué)生信息添加到LIST1里邊,如果發(fā)現(xiàn)文件里邊的學(xué)生信息為空,則繼續(xù)執(zhí)行后面的程序
try:
for i in readTxt():
LIST.append(i)
except:
pass
# 關(guān)于gui的代碼, 用方法封裝比較困難,
# 此處利用if __name__ == '__main__' , 方便代碼折疊, ”閱讀”全局思路
if __name__ == '__main__':
# 以下代碼全部為gui界面的初始化
# 第1步,實(shí)例化對(duì)象,建立窗口window
window = tk.Tk()
# 第2步,給窗口的可視化起名字
window.title('學(xué)生信息管理系統(tǒng) V3.0') # 學(xué)生信息管理系統(tǒng)6 - 1
# 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬)
window.geometry('500x650')
# tk.StringVar()用于接收用戶輸入
result = tk.StringVar()
result.set(" ")
# ①關(guān)于姓名的 label 和 entry
textName = tk.StringVar()
textName.set("")
labelLine1 = tk.Label(window, text="姓 名:", font=('Arial', 15), width=10).place(x=75, y=50, anchor='nw')
entryLine1 = tk.Entry(window, show=None, font=('宋體', 15), textvariable=textName, width=20)
entryLine1.place(x=190, y=50, anchor='nw') # 顯示成明文形式
# ②關(guān)于性別的 label 和 entry
textSex = tk.StringVar()
textSex.set("")
labelLine2 = tk.Label(window, text="性 別:", font=('Arial', 15), width=10)
labelLine2.place(x=75, y=100, anchor='nw')
entryLine2 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textSex, width=18)
entryLine2.place(x=190, y=100, anchor='nw')
# ③關(guān)于電話的 label 和 entry
textPhone = tk.StringVar()
textPhone.set("")
labelLine3 = tk.Label(window, text="電 話:", font=('Arial', 15), width=10).place(x=75, y=150, anchor='nw')
entryLine3 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textPhone, width=18)
entryLine3.place(x=190, y=150, anchor='nw')
# 關(guān)于"添加"組件,此處綁定函數(shù)addStudentsMessage()用于添加學(xué)生信息
button1_add = tk.Button(window, text='添 加', bg='silver', font=('Arial', 12), command=addStudentsMessage, width=8)
button1_add.place(x=40, y=220, anchor='nw')
# 關(guān)于"刪除"組件,此處綁定函數(shù)deleteMessage()用于刪除學(xué)生信息
button2_delete = tk.Button(window, text='刪 除', bg='silver', font=('Arial', 12), command=deleteMessage, width=8)
button2_delete.place(x=150, y=220, anchor='nw')
# 關(guān)于"修改"組件,此處綁定函數(shù)change()用于修改學(xué)生信息
button3_change = tk.Button(window, text='修 改', bg='silver', font=('Arial', 12), command=change, width=8)
button3_change.place(x=260, y=220, anchor='nw')
# 關(guān)于"顯示"組件,此處綁定函數(shù)show()用于顯示學(xué)生信息
button4_show = tk.Button(window, text='顯 示', bg='silver', font=('Arial', 12), command=show, width=8)
button4_show.place(x=370, y=220, anchor='nw')
# 下邊兩行代碼是在gui界面顯示我的作者信息
labelLine_Name = tk.Label(window, text="@Author:", font=('宋體', 13), width=10).place(x=130, y=260, anchor='nw')
labelLine_myID = tk.Label(window, text="︶ㄣ釋然", font=('宋體', 13), width=10).place(x=250, y=260, anchor='nw')
show_result = tk.Label(window, bg="white", fg="black", font=("宋體", 12), bd='0', anchor='nw', textvariable=result)
show_result.place(x="25", y="300", width="450", height="300")
window.mainloop()
?
?
?
?
到了這里,關(guān)于Python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)V3.0(GUI界面)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!