Python GUI項目實戰(一)學生信息管理系統:登錄窗體的設計與實現


前言

前面我們學習了Python GUI 圖像化界面Tkinter的基礎知識,為了檢測我們的學習成果,學以致用。我們從今天開始做一個綜合Tkinter案例--基於Tkinter的學生信息管理系統,一方面熟悉Tkinter項目的開發,另一方面可以把我們前面的《Python基礎學習筆記》的知識綜合在一起。

基礎功能介紹

說明:

由於我們尚未學習數據庫的內容,所以我們這個應用程序開發的過程中,暫時通過文件的讀寫方式來存儲數據。等到后面我們介紹了關系數據庫的知識,整個項目對接到數據庫中也是很方便的。

感興趣的小伙伴們,可以直接私信我免費獲取項目使用到的素材和源碼,我們一起手把手搭建這個項目!

1.登錄功能

1.gif
本項目支持用戶名和密碼的驗證登錄,支持密碼輸入三次自動鎖定等功能;

2. 主窗體

(1)顯示當前登錄用戶名、登錄時間
(2)支持添加學生信息、修改學生信息、刪除學生信息、更改當前賬號密碼
(2)支持多條件查詢學生信息
2.gif
這里我們查詢所有學號以31901開頭的學生,在這些學生中再次篩選手機號碼中有138號段的學生。

3. 添加並查看學生信息

3.gif
點擊添加按鈕可以添加學生信息,保存后,可查看明細信息。同時也支持修改與刪除。

4. 更改當前賬戶的密碼

4.gif
支持更改當前賬戶密碼,同時具備密碼校驗功能。

好啦,從現在開始正式進入項目的開發吧,今天我們要做的內容是登錄界面框架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()
效果:

圖片.png

二、讀取文件

讀取文本中的的用戶信息,記得先判斷文件路徑是否存在,如果文件不存在就彈一個彈窗,如果存在繼續做異常處理是否能打開文件讀取內容。按行讀取,每一行再分割,分割后存儲到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()中,用戶密碼驗證成功后,調用跳轉主窗體的方法即可;
至此,我們登錄窗體就已經搭建完成了!
1.gif

最后

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM