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

news2024/11/28 4:50:05

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泽攸科技桌面型扫描电子显微镜(SEM)技术解析

台式扫描电子显微镜是一种利用电子束扫描样品表面并检测样品反射或发射的电子信号,从而获得样品表面形貌、结构和成分信息的仪器。它的工作原理是由电子枪发出的电子束经过栅极静电聚焦后成为直径50微米的点光源,然后在加速电压作用下,经两三…

JAVA实操经验

零: 按照需要,可以使用需要某个类下(主要是java提供的)的方法来实现某个功能。(主要是用在不同类下的方法会进行重写功能不同) 方法和构造方法不同:方法是方法,构造方法是构造器&a…

[算法每日一练]-双指针 (保姆级教程篇 1) #A-B数对 #求和 #元音字母 #最短连续子数组 #无重复字符的最长子串 #最小子串覆盖 #方块桶

目录 A-B数对 解法一:双指针 解法二:STL二分查找 解法三:map 求和 元音字母 最短连续子数组 无重复字符的最长子串 最小子串覆盖 方块桶 双指针特点:双指针绝不回头 A-B数对 解法一:双指针 先把数列排列成…

GDPU 数据结构 课后作业(持续更新……)

文章目录 第 1 章第 2 章🐷 作业1🐷 作业2 第 3 章🐷 作业1🐷 作业2 第 4 章第 5、6 章二叉树🐷 作业1 第 7 章 哈夫曼树第 8 章 图🐷 图 1🐷 图 2🐷 图 3 第9 章 排序 第 1 章 第 2…

STM32F103

提示:来源正点原子,参考STM32F103 战舰开发指南V1.3PDF资料 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 开发环境硬件普中科技,接…

javaSwing酒店管理系统

一、 使用方法: 在使用前,需要到druid.properties 配置文件中,修改自己对应于自己数据库的属性;如用户名,密码等 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///hotel?useUnicodetrue&characterEn…

【C++】:AVL树

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关多态的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…

C语言 内联函数 + 递归函数

函数分类 内联函数 1)内联函数在编译时将函数的代码直接插入到调用它的地方,而不是通过函数调用的方式执行,从而减少了函数调用的开销,提高了代码的执行速度 2)使用 inline 关键字来声明 3)将函数声明为内联…

深入理解Dubbo-4.Dubbo扩展SPI

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话&#xff…

Redis探秘:AOF日志与数据持久性之旅

第1章:引言 大家好,我是小黑,咱们今天来聊聊Redis。你知道吗,Redis作为一个超高效的内存数据库,真的是超级给力。它可以秒速处理数据,让咱们的应用运行得飞快。但是,小黑得告诉你,虽…

四. 基于环视Camera的BEV感知算法-BEVFormer

目标 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. BEVFormerv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章—…

nginx多ip部署

1.修改网卡信息自定义多个IP 进入/etc/sysconfig/network-scripts,编辑ifcfg-ens33网卡文件。将dhcp动态分配修改成static,同时添加ip地址子网掩码、网关和DNS。 修改完成后重启网卡,systemctl restart network 2.修改nginx配置文件 有几个…

【数据结构实践课设】新生报道注册管理信息系统

目录 1.主要框架 2.写入文件 3.读取文件 4.注册学生信息 5.增加学生信息 6.删除学生信息 7.按姓名查询 8.按班级查询 9.按专业查询 10.打印学生信息 11.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所…

【S32K3环境搭建】-0.4-使用SEGGER J-Link烧录调试程序

【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 导入一个编译没有报错的S32K312工程。接着在菜单栏中,依次选择Debug下拉箭头 -- > Debug Configuration; 在弹出的Create…

FL Studio 21注册机激活码序列号下载 附激活码

FL Studio 21 keygen激活码序列号是一款基于同名软件激活程序。操作非常简单。用户只需使用本激活工具生成激活码,即可一键激活软件所有功能,无需付费。去购买注册程序,永久免费使用所有功能。很多用户应该都知道,专业的编辑工具只…

SpringCloud-高级篇(六)

(1)Seata架构 (2)部署TC服务 修改注册中心:做服务注册,tc服务配置注册中心,tc服务可以做集群,他也是一个服务 ,微服务里面RM 跟TM跟它建立联系肯定是基于注册中心去找&a…

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter 参考自:https://huggingface.co/docs/diffusers/using-diffusers/loading_adapters 如今,对于 diffusion 模型,有许多高效的训练技术来微调一个定制化的模型&…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何大小项目的版本管理。 核心功能: 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外,其他都无脑安装 3、检查一下安装情况 win…

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架,但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现,本文讲解如何将Cunit嵌入Android中,用于测试一些C/C api。 Cunit简介 Cunit是很…

Post Quantum Fuzzy Stealth Signatures and Applications

目录 笔记后续的研究方向摘要引言贡献模块化框架模糊构造实施适用于FIDO Post Quantum Fuzzy Stealth Signatures and Applications CCS 2023 笔记 后续的研究方向 摘要 自比特币问世以来,基于区块链的加密货币中的私人支付一直是学术和工业研究的主题。隐形地址…