前言
前面我們學習了Python GUI 圖像化界面Tkinter的基礎知識,為了檢測我們的學習成果,學以致用。我們從今天開始做一個綜合Tkinter案例--基於Tkinter的學生信息管理系統,一方面熟悉Tkinter項目的開發,另一方面可以把我們前面的《Python基礎學習筆記》的知識綜合在一起。
基礎功能介紹
說明:
由於我們尚未學習數據庫的內容,所以我們這個應用程序開發的過程中,暫時通過文件的讀寫方式來存儲數據。等到后面我們介紹了關系數據庫的知識,整個項目對接到數據庫中也是很方便的。
感興趣的小伙伴們,可以直接私信我免費獲取項目使用到的素材和源碼,我們一起手把手搭建這個項目!
1.登錄功能

本項目支持用戶名和密碼的驗證登錄,支持密碼輸入三次自動鎖定等功能;
2. 主窗體
(1)顯示當前登錄用戶名、登錄時間
(2)支持添加學生信息、修改學生信息、刪除學生信息、更改當前賬號密碼
(2)支持多條件查詢學生信息

這里我們查詢所有學號以31901開頭的學生,在這些學生中再次篩選手機號碼中有138號段的學生。
3. 添加並查看學生信息

點擊添加按鈕可以添加學生信息,保存后,可查看明細信息。同時也支持修改與刪除。
4. 更改當前賬戶的密碼

支持更改當前賬戶密碼,同時具備密碼校驗功能。
好啦,從現在開始正式進入項目的開發吧,今天我們要做的內容是登錄界面框架GUI的設計與功能實現!
一、 登錄界面的實現
from tkinter import *
from tkinter.ttk import *
import os
class LoginWindow(Tk):
"""
創建登錄窗體的GUI界面已經登錄的方法
"""
def __init__(self):
super().__init__() # 先執行tk這個類的初始化
self.title("登錄界面")
# self.geometry("620x420")
self.resizable(0,0) # 窗體大小不允許變,兩個參數分別代表x軸和y軸
self.iconbitmap("."+os.sep+"img"+os.sep+"student.ico")
# self["bg"] = "royalblue"
# 加載窗體
self.setup_UI()
def setup_UI(self):
# ttk中控件使用style對象設定
self.Style01 = Style()
self.Style01.configure("user.TLabel",font = ("華文黑體",20,"bold"),foreground = "royalblue")
self.Style01.configure("TEntry",font = ("華文黑體",20,"bold"))
self.Style01.configure("TButton",font = ("華文黑體",20,"bold"),foreground = "royalblue")
# 創建一個Label標簽展示圖片
self.Login_image = PhotoImage(file = "."+os.sep+"img"+os.sep+"logingui.png")
self.Label_image = Label(self,image = self.Login_image)
self.Label_image.pack(padx = 10,pady = 10)
# 創建一個Label標簽 + Entry --- 用戶名
self.Label_user = Label(self,text = "用戶名:", style = "user.TLabel")
self.Label_user.pack(side = LEFT,padx = 10,pady = 10)
self.Entry_user = Entry(self,width = 12)
self.Entry_user.pack(side = LEFT,padx = 10,pady = 10)
# 創建一個Label標簽 + Entry --- 密碼
self.Label_password = Label(self, text = "密碼:", style = "user.TLabel")
self.Label_password.pack(side = LEFT,padx = 10,pady = 10)
self.Entry_password = Entry(self, width=12,show = "*")
self.Entry_password.pack(side = LEFT,padx = 10,pady = 10)
# 創建一個按鈕 --- 登錄
self.Button_login = Button(self,text = "登錄",width = 4)
self.Button_login.pack(side = LEFT,padx = 20,pady = 10)
if __name__ == '__main__':
this_login = LoginWindow()
this_login.mainloop()
效果:

二、讀取文件
讀取文本中的的用戶信息,記得先判斷文件路徑是否存在,如果文件不存在就彈一個彈窗,如果存在繼續做異常處理是否能打開文件讀取內容。按行讀取,每一行再分割,分割后存儲到user_list[]用戶列表中。
def load_file_info(self):
if not os.path.exists(self.file_path):
showinfo("系統消息","提供的文件名不存在!")
else:
try:
with open(file = self.file_path,mode = "r") as fd:
# 一次讀一行
current_line = fd.readline()
while current_line:
temp_list = current_line.split(",") # 長字符串分割層三個
self.user_list.append(temp_list)
# 讀取下一行,讀完了循環就結束了
current_line = fd.readline()
except:
showinfo("系統消息","文件讀取出現異常!")
存儲用戶信息的文本文件路徑作為全局變量存儲,這樣后面還會調用的時候就不需要重寫方法,其它方法調用也會方便一些。
我們在初始化方法中定義全局變量:
# 定義變量(定義全局變量,后面的函數都能訪問到)
self.file_path = "/Users/yushengtan/Desktop/Demo/Studentmgr/User.txt" # 文件路勁
self.user_list = [] # 存儲用戶信息
# 自動執行文件中賬號的加載
self.load_file_info()
三、獲取輸入賬號的信息
需要在控件里捆綁變量,再定義一個login()方法,通過控件變量.get()方法獲取輸入的值,再給登錄按鈕添加一個command事件
def login(self):
# 獲取用戶的用戶名和密碼
user = self.var_user.get()
password = self.var_password.get()
showinfo(message="用戶名:"+user+"密碼:"+password) # 暫時用彈窗測試一下內容獲取是否正常
四、實現基本的身份驗證
關於登錄驗證,要求如下:
(1)如果用戶名不對,提示:用戶名不存在
(2)如果密碼不對,提示:密碼錯誤
(3)如果密碼連續輸錯三次,提示:賬號已鎖定,請聯系管理員
(4)如果用戶名和密碼正確,加載主窗體
實現基本身份驗證的框架:
# 實現身份驗證,遍歷用戶信息列表
for index in range(len(self.user_list)):
# 用戶名是否正確
if user.strip().lower() == str(self.user_list[index][0]).strip().lower():
# 判斷賬號是否被禁用
if "0" in str(self.user_list[index][2]).strip().lower():
showinfo("系統消息", "賬號已禁用,請聯系管理員")
break
# 密碼是否正確
if password != str(self.user_list[index][1]).strip().lower():
showinfo("系統消息", "輸入的密碼錯誤")
# 判斷成功后整個循環退出,不要執行后面的判斷用戶名不存在的語句了
break
else:
showinfo("系統消息", "登錄成功!")
break
# 如果校驗到最后都沒有相同的用戶名,則用戶名不存在
if index == len(self.user_list) - 1:
showinfo("系統消息","輸入的用戶名不存在")
五、密碼輸錯三次鎖定賬號
首先我們需要使用全局變量記錄密碼輸錯多少次,
def login(self):
# 獲取用戶的用戶名和密碼
user = self.var_user.get()
password = self.var_password.get()
# 實現身份驗證,遍歷用戶信息列表
for index in range(len(self.user_list)):
# 用戶名是否正確
if user.strip().lower() == str(self.user_list[index][0]).strip().lower():
# 判斷賬號是否被禁用
if "0" in str(self.user_list[index][2]).strip().lower():
showinfo("系統消息", "賬號已禁用,請聯系管理員")
break
# 密碼是否正確
if password != str(self.user_list[index][1]).strip().lower():
self.var_password_error_times += 1
# 判讀錯誤是否到三次
if self.var_password_error_times >= 3:
showinfo("系統消息","密碼錯誤已達三次,賬號已鎖定!")
# 改變狀態
self.user_list[index][2] = "0\n"
# 信息寫入到文件
self.write_file_info()
else:
showinfo("系統消息", "輸入的密碼錯誤")
# 判斷成功后整個循環退出,不要執行后面的判斷用戶名不存在的語句了
break
else:
# 如果在三次之內輸入正確了,把錯誤次數歸零
self.var_password_error_times = 0
showinfo("系統消息", "登錄成功!")
break
# 如果校驗到最后都沒有相同的用戶名,則用戶名不存在
if index == len(self.user_list) - 1:
showinfo("系統消息","輸入的用戶名不存在")
將用戶信息寫入文件:
def write_file_info(self):
# 1.清空文件;2.寫入
try:
with open(file = self.file_path,mode="w") as fd:
fd.write("")
with open(file = self.file_path,mode="a") as fd:
for item in self.user_list:
fd.write(",".join(item))
except:
showinfo("系統消息","寫入文件出現異常")
六、完成主窗體的加載
創建一個主窗體maingui.py
from tkinter import *
from tkinter.ttk import *
class MainWindow(Tk):
def __init__(self):
super().__init__()
self.title("主窗體")
self.geometry("900x640+180+80")
self.resizable(0,0)
self["bg"]="royalblue"
在登錄窗體中再定義一個登錄主窗體跳轉方法:
def load_main(self):
# 關閉當前窗體
self.destroy()
# 加載新窗體
if __name__ == '__main__':
main_window = maingui.MainWindow()
在登錄方法login()中,用戶密碼驗證成功后,調用跳轉主窗體的方法即可;
至此,我們登錄窗體就已經搭建完成了!

最后
本節我們先整體介紹了一下該項目的主要功能,然后就開始了項目的第一步:登錄窗體的實現,實現了用戶名和密碼的校驗功能,完成了登錄窗體我們點擊登錄按鈕希望能加載主窗體界面,這該如何實現呢?下一節,我們將介紹主窗體的界面的搭建和功能的實現。
