【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/234645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期末速成数据库极简版【分支循环函数】(4)

目录 全局变量&局部变量 局部变量定义declare 局部变量赋值select 局部变量赋值select 【1】分支结构IF 【2】分支结构CASE 简单CASE语句 搜索CASE语句 【3】循环结构While 【4】系统函数 常用字符串函数 时间函数 【5】自定义函数—标量函数 函数创建 函…

oops-framework框架 之 Excel转Json

引擎: CocosCreator 3.8.0 环境: Mac Gitee: oops-plugin-excel-to-json 注: 作者dgflash的oops-framework框架QQ群: 628575875 配置 作者dgflash在oops-framework的框架中,提供了关于Excel数据表转换为Json和TypeSc…

typora中显示除号的问题

问题 在latex中“除号( \div )” 通常用 \div。但在typora中写数学公式时,却发现 “除号” 如果使用 \div 并没有显示为 “ \div ”,而是 “ ∇ ⋅ \nabla \cdot ∇⋅ ”。 原因 typora中,\div 显示为 ∇ ⋅ \…

Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

Html转PDF,前端JS实现Html页面导出PDF(html2canvasjspdf) 文章目录 Html转PDF,前端JS实现Html页面导出PDF(html2canvasjspdf)一、背景介绍二、疑问三、所使用技术html2canvasjspdf 四、展示开始1、效果展示…

Java第21章网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封 装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络支持,也可 以编写出高质量的网络…

pyinstaller 常用命令参数

PyInstaller是一个用于将Python程序打包成独立的可执行文件的工具。它可以将Python代码和所有依赖的库、资源文件等打包成一个单独的可执行文件,方便在不安装Python解释器的环境中运行。PyInstaller提供了许多参数,用于配置打包过程和生成的可执行文件的…

NSS [NSSCTF 2022 Spring Recruit]babyphp

NSS [NSSCTF 2022 Spring Recruit]babyphp 考点&#xff1a;PHP特性 开局源码直接裸奔 <?php highlight_file(__FILE__); include_once(flag.php);if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){if(isset($_POST[b1])&&…

java--Date、SimpleDateFormat时间类,JDK8之前的

1.Date 代表的是日期和时间 2.SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式。 3.时间格式常见符号 4.SimpleDateFormat解析字符串时间成为日期对象

Redis之IO多路复用模型

Redis之IO多路复用模型 多路复用要解决的问题 解决同步阻塞IO模型下大量线程创建导致资源的浪费问题 同步阻塞IO模式的特点就是用一个进程来处理一个网络连接(一个用户请求)&#xff0c;比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读取数据。 int main…

语义分割 简介及数据集简介

参考文章 MS COCO数据集介绍以及pycocotools简单使用-CSDN博客

Linux7安装tomcat9.0.83教程

1.下载tomcat.tar.gz包 地址&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloads 2.将包上传到linux服并解压 cd /home/local # 跳转到上传包的目录 tar -zxvf apache-tomcat-9.0.83.tar.gz # 解压包 mv apache-tomcat-9.0.83 tomcat # 重命名目录为tomcat cp …

【PUSDN】SpringBoot的jar进行解压后,替换其中的文件重新生成新的jar-SW

当你解压Spring Boot的JAR文件时&#xff0c;实际上是在打开一个压缩文件&#xff0c;类似于ZIP。你可以按照以下步骤进行替换文件并重新生成新的JAR&#xff1a; 解压原始的JAR文件&#xff1a; 使用任何ZIP工具&#xff08;如WinRAR、7-Zip或命令行工具&#xff09;&#xf…

详解异常 ! !(对异常有一个全面的认识)

【本章目标】 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类 1. 异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&#xff0c;出于关心&#xff0c;可能会问&#xff1a;你是不是生病了&#xff0c;需要我陪你去看医…

在线测试http接口,为您解析最佳测试方法

您是否正在寻找一种方便、高效且可靠的方法来测试您的http接口&#xff1f;在这篇文章中&#xff0c;我们将为您介绍在线测试http接口的最佳方法&#xff0c;帮助您确保您的接口在各种情况下都能正常运行。 什么是http接口&#xff1f; 在开始介绍如何测试http接口之前&#x…

AG1KLPQ48 User Manual

1.&#xff09;软件安装&#xff1a; 解压缩或执行安装文件&#xff0c;安装 Supra 软件。执行文件为 bin 目录中的 Supra.exe。 运行 Supra&#xff0c;选择菜单 File -> Import license&#xff0c;选择 license 文件并导入 License。 2.&#xff09;新建项目&#xff1a;…

掌握iText:轻松处理PDF文档-进阶篇

简体中文写入 iText本身对简体中文的支持有限&#xff0c;但可以通过引入额外的字体包来增强其对简体中文的支持。例如&#xff0c;可以使用iTextAsian.jar这个亚洲字体包&#xff0c;它包含了几种简单的亚洲字体&#xff0c;其中包括简体中文字体。只需要将iTextAsian.jar放到…

Star CCM+ 停止并保存用命令行运行的计算

在 StarCCM 命令行运行 中介绍了命令行运行计算的方法&#xff0c;有网友询问停止计算的命令&#xff0c;但计算一旦提交之后应该是不能用命令结束的&#xff0c;除非是用 kill 或任务管理器直接结束进程。然而&#xff0c;直接结束进程不会自动保存计算结果。 问题 通常情况下…

tidb安装 centos7单机集群

安装 [rootlocalhost ~]# curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh [rootlocalhost ~]# source .bash_profile [rootlocalhost ~]# which tiup [rootlocalhost ~]# tiup playground v6.1.0 --db 2 --pd 3 --kv 3 --host 192.168.1…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

用 Python 自动创建 Markdown 表格

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Markdown表格是文档中整理和展示数据的重要方式之一。然而&#xff0c;手动编写大型表格可能会费时且容易出错。本文将介绍如何使用Python自动创建Markdown表格&#xff0c;通过示例代码详细展示各种场景下的创建…