【Python】手把手教你用tkinter设计图书管理登录UI界面(三)

上一篇:【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 ttk

from 图书管理系统项目.code.继承登录UI完善功能_1 import LoginUI_one


class 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()    # 销毁成功登录UI
        self.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

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 03:26:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 03:26:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 03:26:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 03:26:04       18 阅读

热门阅读

  1. 在Redis中设置一个键值对并为其指定过期时间

    2023-12-11 03:26:04       35 阅读
  2. Git的常用命令、场景及其实例

    2023-12-11 03:26:04       38 阅读
  3. C++入门

    C++入门

    2023-12-11 03:26:04      32 阅读
  4. stm32通过编码器控制小车行驶指定的距离

    2023-12-11 03:26:04       38 阅读
  5. Nmap脚本简介

    2023-12-11 03:26:04       34 阅读
  6. GPT3年终总结

    2023-12-11 03:26:04       28 阅读