上一篇:【Python】手把手教你用tkinter設計圖書管理登錄UI界面(二)-CSDN博客
下一篇:
緊接上一篇文章,繼續完善項目功能:用戶登錄。由于老王的注冊部分有億點點復雜,還沒完成,但是不影響項目進度,我們可以模擬幾個注冊的用戶來參與項目設計(如下圖)。
首先在“圖書管理系統項目\user_data”目錄下新建“已注冊用戶數據庫.txt”文件用于存儲注冊用戶數據(可以做數據加密寫入,解密讀取),如下圖。
然后在“圖書管理系統項目\code”目錄下新建“繼承登錄UI完善功能_2.py”繼承“繼承登錄UI完善功能_1.py”模塊來設計。(如下圖)
運行結果
導入【圖書管理系統項目.code.登錄UI】模塊
導入【圖書管理系統項目.code.繼承登錄UI完善功能_1】模塊
[['最帥周華', '123.com', '10086'], ['禿頂老王', '123456', '10000'], ['法外狂徒張三', 'good_boy', '10010']]
繼承登錄UI完善功能_2.py
"""繼承登錄UI完善功能_2 模塊
"""# 通配符 '*'
__all__ = ['LoginUI_two']import os, re, time
import tkinter as tk
from tkinter import ttkfrom 圖書管理系統項目.code.繼承登錄UI完善功能_1 import LoginUI_oneclass LoginUI_two(LoginUI_one):"""繼承LoginUI,完善登錄UI功能"""def __init__(self):"""構造方法"""# 調用LoginUI的構造方法super().__init__()# 完善登錄UI功能# 獲取已注冊的用戶數據self.getUserData('..\\user_data\\已注冊用戶數據庫.txt')# 用戶登錄self.loginButton.config(command=self.userLogin)# self.loginSucceedUI() # 模擬登錄成功# 登錄成功(UI)def loginSucceedUI(self):# 登錄成功UI窗口設計self.succeedUI = tk.Toplevel(self) # 頂級窗口self.succeedUI.title('登錄成功') # 窗口標題self.succeedUI.geometry(f'610x406+{self.width//4}+{self.height//8}')self.succeedUI.resizable(0, 0) # 窗口大小禁止調節self.succeedUI.focus() # 窗口焦點self.withdraw() # 隱藏主窗口(登錄UI)# 顯示內容tk.Label(self.succeedUI, text='登錄成功\n\n發散思維自定義設計', font=(None, 20, 'bold')).pack(fill=tk.BOTH, expand=1)# 顯示時鐘self.timeVar = tk.StringVar()tk.Label(self.succeedUI, textvariable=self.timeVar, font=(None, 18, 'bold')).place(x=250, y=40)# 登錄UI返回self.returnButton = ttk.Button(self.succeedUI, text='返回', command=self.succeedUI_return)self.returnButton.place(x=460, y=350)# 窗口關閉觸發self.succeedUI.protocol("WM_DELETE_WINDOW", self.succeedUI_return)self.stopFlag = 1 # 停止顯示時鐘旗幟self.showTime() # 顯示時鐘# 顯示時鐘def showTime(self):# 循環顯示時間while self.stopFlag:self.timeVar.set(time.strftime('%X\n%x\n%A'))self.succeedUI.update() # 更新窗口time.sleep(0.001) # 睡眠1毫秒# 登錄成功UI返回def succeedUI_return(self):self.deiconify() # 顯示主窗口(登錄UI)self.succeedUI.destroy() # 銷毀成功登錄UIself.stopFlag = 0 # 停止顯示時鐘(結束循環)# 初始化數據self.userName.set('')self.password.set('')self.inputVerifyCode.set('')self.showVerifyCode.set('獲取驗證碼')self.showOrConcealCount = 0 # 默認是密碼隱藏# 獲取已注冊的用戶數據def getUserData(self, path):# 用戶數據容器self.userData = []# 判斷文件是否被創建if os.path.exists(path):# 讀取已注冊用戶數據庫數據with open(path, encoding='utf-8') as file:for line in file:if line != '\n':self.userData.append(line.split())# print(self.userData)# 用戶登錄def userLogin(self):# print([self.userName.get(), self.password.get(), self.inputVerifyCode.get(), self.showVerifyCode.get()])# 如果用戶數據為空if not self.userData:self.bell() # 警告聲self.hintLabel.config(text='恭喜您是首位用戶\n 快來注冊體驗吧!', background='pink') # 輸入錯誤提示語self.hintLabel.place(x=228, y=115) # 顯示錯誤提示標簽內容self.update() # 窗口更新time.sleep(1) # 睡眠1秒self.hintLabel.place_forget() # 隱藏錯誤提示標簽內容return# 查找用戶名是否已注冊for name in self.userData:# 如果已注冊if name[0] == self.userName.get():# 驗證密碼是否正確if name[1] == self.password.get():# 判斷驗證碼是否正確if re.findall(self.showVerifyCode.get(), self.inputVerifyCode.get(), re.I):# 登錄成功print('登錄成功')self.loginSucceedUI()return# 驗證碼錯誤else:self.verifyEntry.focus() # 設置焦點self.hintLabel.config(text='驗證碼輸入錯誤', background='red') # 輸入錯誤提示語break# 密碼錯誤else:self.passwordEntry.focus() # 設置焦點self.hintLabel.config(text='密碼輸入錯誤', background='red') # 輸入錯誤提示語break# 用戶名錯誤elif name == self.userData[-1]:self.userEntry.focus_set() # 設置焦點self.hintLabel.config(text='用戶名輸入錯誤', background='red') # 輸入錯誤提示語# 警告聲與更新驗證碼self.bell() # 警告聲self.updateVerifyCode() # 更新驗證碼self.hintLabel.place(x=228, y=115) # 顯示錯誤提示標簽內容self.update() # 窗口更新time.sleep(1) # 睡眠1秒self.hintLabel.place_forget() # 隱藏錯誤提示標簽內容# 代碼測試
if __name__ == '__main__':ui = LoginUI_two() # 對象實例化ui.mainloop() # 窗口主循環
else:print(f'導入【{__name__}】模塊')
作者:周華
創作日期:2023/12/10