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

上一篇:【Python】手把手教你用tkinter设计图书管理登录UI界面(三)-CSDN博客

下一篇:

本文主要阐述完成“用户密码找回”,诸位且看我如何实现吧!

为了方便使用“已注册用户数据库.txt”的数据,我直接继承上一篇文章实现功能的模块类:

图书管理系统项目.code.继承登录UI完善功能_2.LoginUI_two,并创建了Retrieve类,保存在“继承登录UI完善功能_3.py”模块(如下图)

运行结果

导入【图书管理系统项目.code.登录UI】模块
导入【图书管理系统项目.code.继承登录UI完善功能_1】模块
导入【图书管理系统项目.code.继承登录UI完善功能_2】模块
[['最帅周华', '123.com', '10086'], ['秃顶老王', '123456', '10000'], ['法外狂徒张三', 'good_boy', '10010']]
找回成功

继承登录UI完善功能_3.py

"""
    继承登录UI完善功能_3 模块
"""

# 通配符 '*'
__all__ = ['Retrieve']

import re, time
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as tkmb

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


class Retrieve(LoginUI_two):
    """继承LoginUI_two,设计用户密码找回"""

    def __init__(self):
        """构造方法"""

        # 调用LoginUI的构造方法
        super().__init__()

        # 设计用户密码找回

        # 找回按钮
        self.retrieveButton.config(command=self.passwordRetrieve)


    # 用户密码找回
    def passwordRetrieve(self):
        # 设计窗口
        self.retrieveUI = tk.Toplevel(self)
        self.retrieveUI.title('用户密码找回')
        self.retrieveUI.geometry(f'600x375+{self.width//4}+{self.height//8}')
        self.retrieveUI.resizable(0, 0)      # 窗口大小禁止调节
        self.retrieveUI.focus_force()        # 窗口焦点
        self.withdraw()  # 隐藏主窗口(登录UI)

        # 输入格式错误提示
        self.retrieve_hintLabel = tk.Label(self.retrieveUI, text='输入格式错误提示', width=20)
        # self.retrieve_hintLabel.place(x=155, y=55)

        # 用户名
        tk.Label(self.retrieveUI, text='用  户 名').place(x=100, y=100)

        # 用户名输入框
        self.retrieve_userVar = tk.StringVar()
        if self.userName.get() != '请输入用户名': self.retrieve_userVar.set(self.userName.get())
        self.retrieve_userEntry = ttk.Entry(self.retrieveUI, textvariable=self.retrieve_userVar)
        self.retrieve_userEntry.place(x=160, y=100)

        # 手机号码
        tk.Label(self.retrieveUI, text='手机号码').place(x=100, y=150)

        # 手机号码输入框
        self.retrieve_phoneVar = tk.StringVar()
        self.retrieve_phoneEntry = ttk.Entry(self.retrieveUI, textvariable=self.retrieve_phoneVar)
        self.retrieve_phoneEntry.place(x=160, y=150)

        # 验证码
        tk.Label(self.retrieveUI, text='验  证 码').place(x=100, y=200)

        # 验证码输入框
        self.retrieve_inputVerifyVar = tk.StringVar()
        self.retrieve_verifyEntry = ttk.Entry(self.retrieveUI, width=9, textvariable=self.retrieve_inputVerifyVar)
        self.retrieve_verifyEntry.place(x=160, y=200)

        # 获取验证码
        self.retrieve_showVerifyVar = tk.StringVar(value='获取验证码')
        self.retrieve_verifyButton = ttk.Button(self.retrieveUI, width=9, textvariable=self.retrieve_showVerifyVar,
                                                command=lambda: self.retrieve_showVerifyVar.set(self.getVerifyCode()))
        self.retrieve_verifyButton.place(x=234, y=198)

        # 确认
        self.retrieve_confirmButton = ttk.Button(self.retrieveUI, text='确认', command=self.confirmRetrieve)
        self.retrieve_confirmButton.place(x=100, y=250)

        # 取消(没有头绪设计)
        self.retrieve_cancelButton = ttk.Button(self.retrieveUI, text='取消')
        self.retrieve_cancelButton.place(x=220, y=250)

        # 返回
        self.retrieve_returnButton = ttk.Button(self.retrieveUI, text='返回', command=self.retrieveUI_return)
        self.retrieve_returnButton.place(x=460, y=320)

        # 窗口关闭触发
        self.retrieveUI.protocol("WM_DELETE_WINDOW", self.retrieveUI_return)


    # 确认找回密码
    def confirmRetrieve(self):
        # print([self.retrieve_userVar.get(),self.retrieve_phoneVar.get(),self.retrieve_inputVerifyVar.get(),self.retrieve_showVerifyVar.get()])

        # 如果用户数据为空
        if not self.userData:
            self.bell()         # 警告声
            self.retrieve_hintLabel.config(text='恭喜您是首位用户\n  快来注册体验吧!', background='pink')  # 输入错误提示语
            self.retrieve_hintLabel.place(x=155, y=55)  # 显示错误提示标签内容
            self.retrieveUI.update()                    # 窗口更新
            time.sleep(1)                               # 睡眠1秒
            self.retrieve_hintLabel.place_forget()      # 隐藏错误提示标签内容
            return

        # 查找用户名是否已注册
        for name in self.userData:
            # 如果已注册
            if name[0] == self.retrieve_userVar.get():
                # 验证手机号码是否正确
                if name[2] == self.retrieve_phoneVar.get():
                    # 判断验证码是否正确
                    if re.findall(self.retrieve_showVerifyVar.get(), self.retrieve_inputVerifyVar.get(), re.I)\
                            and self.retrieve_showVerifyVar.get() != '获取验证码':
                        # 登录成功
                        print('找回成功')
                        self.retrieve_password(name)

                        return
                    # 验证码错误
                    else:
                        self.retrieve_verifyButton.focus()  # 设置焦点
                        self.retrieve_hintLabel.config(text='验证码输入错误', background='red')  # 输入错误提示语
                        break
                # 手机号码错误
                else:
                    self.retrieve_phoneEntry.focus_set()  # 设置焦点
                    self.retrieve_hintLabel.config(text='手机号码输入错误', background='red')  # 输入错误提示语
                    break
            # 用户名错误
            elif name == self.userData[-1]:
                self.retrieve_userEntry.focus()  # 设置焦点
                self.retrieve_hintLabel.config(text='用户名输入错误', background='red')  # 输入错误提示语

        # 警告声与更新验证码
        self.bell()  # 警告声
        self.retrieve_showVerifyVar.set('获取验证码')
        self.retrieve_hintLabel.place(x=155, y=55)  # 显示错误提示标签内容
        self.retrieveUI.update()                    # 窗口更新
        time.sleep(1)                               # 睡眠1秒
        self.retrieve_hintLabel.place_forget()      # 隐藏错误提示标签内容


    # 找回用户密码
    def retrieve_password(self, name):
        self.retrieveUI.bell()  # 警告声
        # 禁止窗口使用
        self.retrieveUI.attributes("-disabled", True)

        # 确认是否
        if tkmb.askokcancel('密码成功找回', f'您的账户信息如下:{" "*50}\n用户名: {name[0]}\n密    码: {name[1]}\n绑定手机号码: {name[2]}'
                                          f'\n\n是否返回登录?', parent=self.retrieveUI):
            # 恢复窗口使用
            self.retrieveUI.attributes("-disabled", False)
            # 返回登录UI
            self.retrieveUI_return()
            return

        # 恢复窗口使用
        self.retrieveUI.attributes("-disabled", False)

        self.retrieve_showVerifyVar.set('获取验证码')
        self.retrieveUI.focus_force()  # 窗口焦点


    # 返回登录UI
    def retrieveUI_return(self):
        self.deiconify()            # 显示主窗口(登录UI)
        self.retrieveUI.destroy()   # 销毁当前窗口

        if self.retrieve_userVar.get() != self.userName.get():
            self.userName.set(self.retrieve_userVar.get())
            self.userEntry.config(foreground='black')

        # 初始化数据
        self.password.set('')
        self.inputVerifyCode.set('')
        self.showVerifyCode.set('获取验证码')
        self.showOrConcealCount = 0  # 默认是密码隐藏


# 代码测试
if __name__ == '__main__':
    ui = Retrieve()         # 对象实例化
    ui.mainloop()           # 窗口主循环
else:
    print(f'导入【{__name__}】模块')

作者:周华

创作日期:2023/12/12

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

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

相关文章

input、el-input输入框输入规则

一、input 只能输入框只能输入正整数&#xff0c;输入同时禁止了以0开始的数字输入&#xff0c;防止被转化为其他进制的数值。 <!-- 不能输入零时--> <input typetext οninput"valuevalue.replace(/^(0)|[^\d]/g,)"><!-- 能输入零时--> <inp…

AI 绘画快速开始-StableDiffusionWebui

文章目录 介绍WebUI 的安装和部署参数介绍Prompt技巧初阶Prompt&#xff1a;直接描述的精细化二阶Prompt&#xff1a;巧用标签的扩展三阶Prompt&#xff1a;负面提示词的深入应用四阶Prompt&#xff1a;文本权重调整的细化引入 LoRA&#xff1a;模型特效的创新应用 案例-生成漫…

如何排查rpc mount export: RPC: Timed out问题

文章目录 问题描述查看nfs服务是否运行正常如果以上都通过,尝试下面步骤 问题描述 我们将讨论您在 NFS 客户端上看到的 NFS 错误之一的故障排除。在尝试与 NFS 相关的命令时可以看到此错误&#xff0c;如下所示&#xff1a; 通常&#xff0c;当您看到此错误时&#xff0c;您也…

class068 更多的动态规划【算法】

class068 更多的动态规划【算法】 算法讲解068【必备】见识更多二维动态规划题目 code1 115. 不同的子序列 // 不同的子序列 // 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数 // 测试链接 : https://leetcode.cn/problems/distinct-subseque…

在windows11上彻底关闭系统更新

最近在windows11系统上发现网上的一些方法不太有效&#xff0c;系统还是会自己更新。像该注册表&#xff0c;计划任务等这些&#xff0c;在windows11上都不太行。下面介绍一个在windows11上有效的方法&#xff0c;先看看效果图吧。如下&#xff1a; 在最新windows11上面 在较新…

Python之Requests库使用总结

概述 Requests是python中一个很Pythonic的HTTP库&#xff0c;用于构建HTTP请求与解析响应 Requests开发哲学 Beautiful is better than ugly.(美丽优于丑陋) Explicit is better than implicit.(直白优于含蓄) Simple is better than complex.(简单优于复杂) Complex is bett…

windows安装pyskl

一.前提条件 先安装好anaconda&#xff0c;pycharm 二.下载好pyskl代码 pyskl地址&#xff1a; 三.环境安装 conda create -n pyskl python3.8 conda activate pyskl先看下requirements.txt中需要安装的包 有些包是需要单独安装的&#xff0c;如pytorch,这个根据自己cuda…

DSP28335之CAN通信易错点总结

一、CAN初始化流程 ①接收发送引脚初始化&#xff1b; ②接收和发送邮箱设置&#xff1b; ③邮箱使能&#xff1b; ④波特率配置&#xff1b; ⑤接收掩码设置&#xff1b; ⑥中断配置。 二、几个重要的知识点 ①影子寄存器 因为ECanbRegs是不可以单独对位操作&#xf…

PHP操作ZIP之ZipArchive类以及如何避免生成压缩文件带有目录层级的问题

常用的方法 php ZipArchive可以说是php自带的一个函数了&#xff0c;他可对对文件进行压缩与解压缩处理&#xff0c;但是使用此类之前我们必须在php.ini中把extensionphp_zip.dll前面的分号有没有去掉&#xff0c;然后再重启Apache这样才能使用这个类库。 ziparchive 可选参数…

嵌入式培训-Linux系统及C编程高级-DAY1718-编译器

GCC编译器 GCC简介 GCC 原名为 GNU C 语言编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;只能处理 C 语言。但其很快扩展&#xff0c;变得可处理 C&#xff0c;后来又扩展为能够支持更多编程语言&#xff0c;如 Fortran、Pascal、Objective -C、Java、Ada、Go 以及…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

作业12.12

1.闹钟 主函数 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);t new QTimer(this);idstartTimer(1000);speecher new QTextToSpeech(this); }Widget::~Wid…

IO进程线程day8

作业 1> 使用三个程序来完成输出 ABCABCABCABCABC #include<myhead.h> #include"sem.h" #define PAGE_SIZE 4096 int main(int argc, const char *argv[]) {int semidcreate_sem(3);printf("semid%d\n",semid);if(semid-1){perror("create…

WPF-附加属性《十二》

非常重要 依赖属性和附加属性&#xff0c;两者是有关系的&#xff0c;也是有些区别的&#xff0c;很多时候&#xff0c;可能会把两者混淆了。 附加属性&#xff08;Attach Property&#xff09; 顾名思义&#xff0c;就是附加上面的属性&#xff0c;自身是没有的&#xff0c;…

boost graph之基础

结构 属性相关 #mermaid-svg-PZQvKfbwNSnyXO9g {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-icon{fill:#552222;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-text{fill:#552222;stroke:#5522…

21、pytest参数化中标记单独的测试用例

官方实例 # content of test_expectation_xfail import pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),pytest.param("6*9",42,markspytest.mark.xfail)], ) def test_eval(test_input, expected):asser…

2023-12-12 AIGC-AI工具的基本工作原理

摘要: 2023-12-12 AIGC-AI工具的基本工作原理 AI工具的基本工作原理 AI工具的基本工作原理涉及到一系列复杂的技术和算法。这些原理可以根据不同类型的AI工具进行概括&#xff0c;包括机器学习、自然语言处理、图像识别等。以下是一些关键的AI工具及其工作原理的概述&#xff…

类加载机制与反射

类加载机制与反射 一.虚拟机类加载机制 1.虚拟机类加载机制概述 虚拟机把描述类的数据从class文件加载到内存 将类的数据进行校验,转换解析和初始化 形成可以被java虚拟机直接使用的java类型 2.类加载过程 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加…

WEB渗透—PHP反序列化(一)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…