Python 自定义模块和包实现GUI(图形界面)登录界面

news2024/11/18 1:46:48

上一篇:Python 自定义模块和包设计英语生词本(文件版)-CSDN博客

紧接上一篇博文,当我们熟练掌握自定义模块和包、掌握文件的的读取与写入、掌握正则表达式内置模块"re"、掌握GUI(图形界面)的部分组件后,接着我们将要以上的知识点结合起来,设计一个GUI(图形界面)登录界面。且看我如何一步两步......完成设计吧。

一、作品展示

1.运行结果

2.设计代码

"""
    账户密码登录
"""

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


# 获取验证码
def getVerifyCode(object):
    from 小功能包.验证码 import verify_code
    object.set(verify_code.verify_code(6))
    return verify_code.verify_code(6)


# 读取文件数据
def readFileData():
    from 小功能包.文件操作 import ReadFileData as read
    data = read.readlinesData(userDataPath, [])

    if data != '文件不存在':
        global userData
        userData = data


# 查找账户
def findID(id):
    readFileData()  # 读取文件数据

    # 查找账户
    for i in userData:
        if i.strip('\n').split(' ')[0] == id:
            return i.strip('\n').split(' ')

    return None


# 账户登录
def IDenter(ID, password, inputVerify, verifyCode, label):
    # print(ID.get(), password.get(), inputVerify.get(), verifyCode.get(), label.get())
    # 查找账户是否存在
    data = findID(ID.get())

    # 校对账户
    if data:
        # 校对密码
        if data[1] == password.get():
            # 校对验证码
            import re
            if re.findall(verifyCode.get(), inputVerify.get(), re.I):
                label.set('登录成功')
                # 初始化输入框
                ID.set('')
                password.set('')
                inputVerify.set('')
            # 验证码输入错误
            else:
                label.set('验证码输入错误')
                inputVerify.set('')
        # 密码输入错误
        else:
            label.set('密码输入错误')
            password.set('')
    # 账户输入错误
    else:
        label.set('账户名输入错误')
        ID.set('')

    getVerifyCode(verifyCode)   # 更新验证码


# 账户注册
def IDregister(ID, password, inputVerify, verifyCode, label):
    # print(ID.get(), password.get(), inputVerify.get(), verifyCode.get(), label.get())

    # 查找账户是否存在
    data = findID(ID.get())

    # 防止账户密码输入特殊字符空格' '
    import re
    IDdata = re.findall(r'\W', ID.get())
    passwordData = re.findall(r'\W', password.get())
    if ' ' in IDdata:
        label.set('账户名不能使用空格')
        ID.set('')
    elif ' ' in passwordData:
        label.set('密码不能使用空格')
        password.set('')

    # 防止输入内容为空''
    elif not ID.get():
        label.set('账户名不能为空')
    elif not password.get():
        label.set('密码不能为空')

    # 校对账户
    elif not data:
        # 校对验证码
        import re
        if re.findall(verifyCode.get(), inputVerify.get(), re.I):
            # 保存到列表中
            userData.append(f'{ID.get()} {password.get()}')

            label.set('账户注册成功')
            # 初始化输入框
            ID.set('')
            password.set('')
            inputVerify.set('')

            # 更新文件数据
            from 小功能包.文件操作 import WriteFileData
            WriteFileData.writelinesData(userDataPath, userData)

        # 验证码输入错误
        else:
            label.set('验证码输入错误')
            inputVerify.set('')

    # 账户输入错误
    else:
        label.set('该账户名已注册')
        ID.set('')

    getVerifyCode(verifyCode)   # 更新验证码


# 全局变量
userDataPath = '.\\..\\user data\\data.txt'
userData = []


# 主函数
def main():
    import tkinter as tk
    base = tk.Tk()              # 新建窗口
    base.title('账户密码登录')    # 标题

    # 全局变量
    labelData = tk.StringVar()        # 标签数据
    ID = tk.StringVar()               # 账号数据
    password = tk.StringVar()         # 密码数据
    inputVerifyCode = tk.StringVar()  # 输入验证码数据
    verifyCode = tk.StringVar()       # 验证码

    # 初始化设置
    verifyCode.set(getVerifyCode(verifyCode))    # 初始验证码
    labelData.set('欢迎来到【周华2022博客】客户端')

    # 标签提示语
    textLabel = tk.Label(base, textvariable=labelData, height=2)      # 文本标签
    textLabel.pack()

    # 账号    ----------------------------------------------------------------------------
    IDframe = tk.Frame(base, pady=8)      # 账号框架
    IDframe.pack()
    # 账号标签
    IDlabel = tk.Label(IDframe, text='账户')
    IDlabel.pack(side=tk.LEFT)
    # 账号文本框
    IDentry = tk.Entry(IDframe, text=ID, highlightthickness=1)
    IDentry.pack(side=tk.RIGHT)

    # 密码    -----------------------------------------------------------------------------
    passwordFrame = tk.Frame(base, pady=8)  # 密码框架
    passwordFrame.pack()
    # 密码标签
    passwordLabel = tk.Label(passwordFrame, text='密码')
    passwordLabel.pack(side=tk.LEFT)
    # 密码文本框
    passwordEntry = tk.Entry(passwordFrame, text=password, highlightthickness=1, show='*')
    passwordEntry.pack(side=tk.RIGHT)

    # 验证码   -----------------------------------------------------------------------------
    verifyFrame = tk.Frame(base, pady=6)  # 验证码框架
    verifyFrame.pack()
    # 验证码标签
    verifyLabel = tk.Label(verifyFrame, text='验证码')
    verifyLabel.pack(side=tk.LEFT)
    # 验证码文本框
    verifyEntry = tk.Entry(verifyFrame, text=inputVerifyCode, highlightthickness=1, width=9)
    verifyEntry.pack(side=tk.LEFT)
    # 验证码更新1
    image = tk.PhotoImage(file='.\\..\\photo\\刷新.png')
    updataButton = tk.Button(verifyFrame, textvariable=verifyCode, relief=tk.FLAT)
    updataButton.config(image=image, width=20, height=20)
    updataButton.config(command=lambda: getVerifyCode(verifyCode))
    updataButton.pack(side=tk.LEFT)
    # 验证码更新2
    verifyUpdata = tk.Button(verifyFrame, textvariable=verifyCode, relief=tk.FLAT)
    verifyUpdata.config(command=lambda: getVerifyCode(verifyCode), width=7)
    verifyUpdata.pack()

    # 按钮    ------------------------------------------------------------------------------
    buttonFrame = tk.Frame(base, padx=60, pady=10)  # 按钮框架
    buttonFrame.pack()
    # 账号登录按钮
    enterButton = tk.Button(buttonFrame, text='登录')
    enterButton.config(command=lambda: IDenter(ID, password, inputVerifyCode, verifyCode, labelData))
    enterButton.pack(side=tk.LEFT)
    # 空白标签(隔开按钮)
    blankLabel = tk.Label(buttonFrame, width=6)
    blankLabel.pack(side=tk.LEFT)
    # 账号注册按钮
    registerButton = tk.Button(buttonFrame, text='注册')
    registerButton.config(command=lambda: IDregister(ID, password, inputVerifyCode, verifyCode, labelData))
    registerButton.pack()

    base.mainloop()             # 循环运行窗口


# 代码测试
if __name__ == '__main__':
    main()

3.模块设计,当前小程序只用了两个模块:文件操作.py、验证码.py

① 模块一:文件操作.py

"""
    文件操作模块
"""


# 通配符'*'变量定义
__all__ = ['main']


# 获取绝对路径    ------------------------------------------------------------------------
__all__.append('getAbsPath')    # 通配符'*'添加元素
def getAbsPath(path):
    import os, sys
    return os.path.abspath(sys.path[0]+path)


# 新建目录文件    ------------------------------------------------------------------------
__all__.append('makeDirFile')    # 通配符'*'添加元素
def makeDirFile(path):

    # 路径分割
    dirPath = ''
    for i in path.split('\\')[:-1:]:
        dirPath += i + '\\'

    makeDir(dirPath)    # 新建目录
    makeFile(path)      # 新建文件


# 新建目录  -----------------------------------------------------------------------------
__all__.append('makeDir')    # 通配符'*'添加元素
def makeDir(path):
    path = getAbsPath(path)     # 获取绝对路径

    # 判断文件是否存在,否则新建目录
    import os
    if not os.path.exists(path):
        os.mkdir(path)


# 新建文件  -----------------------------------------------------------------------------
__all__.append('makeFile')    # 通配符'*'添加元素
def makeFile(path):
    path = getAbsPath(path)     # 获取绝对路径

    # 判断文件是否存在,否则新建文件
    import os
    if not os.path.exists(path):
        file = open(file=path, mode='w')
        file.close()


# 读取文件数据    =========================================================================
__all__.append('ReadFileData')    # 通配符'*'添加元素
class ReadFileData:
    # 构造方法
    def __init__(self):
        pass

    # 读取文件行数据,返回读取的数据   --------------------------------------------------------
    @classmethod
    def readlinesData(cls, path, container):
        data = container
        if container == list():     # 变量赋值
            data = []

        path = getAbsPath(path)     # 获取绝对路径

        # 判断文件是否存在
        import os
        if not os.path.exists(path):
            return '文件不存在'

        # 读取文件数据
        with open(path, encoding='utf-8') as file:
            for i in file:
                if container == str():  # 字符串容器
                    data += i
                elif container == list():  # 列表容器
                    data.append(i)
                else:
                    print('存储读取数据类型必须为字符串str()或者列表list()')

        return data

    # 读取文件行数据,返回读取的数据   --------------------------------------------------------
    @classmethod
    def readSplitData(cls, path, split, container):
        if container == list():
            data = []
        elif container == dict():
            data = dict()

        path = getAbsPath(path)     # 获取绝对路径

        # 判断文件是否存在
        import os
        if not os.path.exists(path):
            return '文件不存在'

        # 读取文件数据
        with open(path, encoding='utf-8') as file:
            for i in file:
                if container == list():
                    data.append(i.split(split))
                elif container == dict():
                    data[i.split(split)[0]] = i.split(split)[1::]
                else:
                    print('存储读取数据类型必须列表list()或者字典dict()')

        return data


# 写入文件数据    =========================================================================
__all__.append('WriteFileData')    # 通配符'*'添加元素
class WriteFileData:
    # 构造方法
    def __init__(self):
        pass

    # 写入文件行数据   --------------------------------------------------------------------
    @classmethod
    def writelinesData(cls, path, data):
        makeDirFile(path)           # 新建目录和文件
        path = getAbsPath(path)     # 获取绝对路径

        # 写入文件数据
        with open(path, 'w', encoding='utf-8') as file:
            if type(data) == str:
                file.write(data)
                if data[-1] != '\n':
                    file.write('\n')
            elif type(data) == list:
                for i in data:
                    file.write(i)
                    if i[-1] != '\n' and i == data[-1]:
                        file.write('\n')
            else:
                print('写入数据类型必须为字符串str()或者列表list()')

    # 写入文件行数据   --------------------------------------------------------------------
    @classmethod
    def writeSplitData(cls, path, data, split):
        makeDirFile(path)           # 新建目录和文件
        path = getAbsPath(path)     # 获取绝对路径

        # 写入文件数据
        with open(path, 'w', encoding='utf-8') as file:
            if type(data) == list:
                for i in data:
                    for j in i:
                        file.write(j)
                        if i[-1] != j:
                            file.write(split)
                        if j[-1] != '\n' and i[-1] == j:
                            file.write('\n')

            elif type(data) == dict:
                for i, j in data.items():
                    file.write(i)
                    for k in j:
                        file.write(split + k)
                        if k == j[-1] and k[-1] != '\n':
                            file.write('\n')

            else:
                print('写入数据类型必须为列表list()或者字典dict()')


# 主函数   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def main():
    print(ReadFileData.readlinesData('.\\..\\十六进制颜色码.txt', ''))
    print(ReadFileData.readSplitData('.\\..\\十六进制颜色码.txt', '、', dict()))
    data = ReadFileData.readlinesData('.\\..\\十六进制颜色码.txt', '')
    WriteFileData.writelinesData('.\\..\\123\\456.txt', data)
    data2 = ReadFileData.readSplitData('.\\..\\十六进制颜色码.txt', '、', dict())
    WriteFileData.writeSplitData('.\\..\\456\\789.txt', data2, '(*)')


# 代码测试
if __name__ == '__main__':
    main()
else:
    print(f'导入"{__name__}"模块')

② 模块二:验证码.py

"""
    获取验证码模块
"""


# 定义此属性是为了方便使用通配符‘*’
__all__ = ['main']


# 获取验证码     ===================================================================
__all__.append('verify_code')    # 通配符'*'添加元素
class verify_code:
    __int_list = []     # 用于存储数字
    __str_list = []     # 用于存储字母
    __all_list = []     # 用于存储数字和字母

    # 列表添加元素    --------------------------------------------------------------
    @classmethod
    def __list_append(cls):
        # 初始化清空
        cls.__int_list = []
        cls.__str_list = []
        cls.__all_list = []

        # 获取0-9数字
        for i in range(10):
            cls.__int_list.append(str(i))

        # 获取26个大小写字母
        for i in range(26):
            cls.__str_list.append(chr(ord('a')+i))
            cls.__str_list.append(chr(ord('A')+i))

        # 把数字和字母列表集合到一起
        for i in range(5):
            cls.__all_list.extend(cls.__int_list)

        cls.__all_list.extend(cls.__str_list)

    # 获取列表元素    --------------------------------------------------------------
    @classmethod
    def get_list_element(cls, list, int):
        import random
        code = ''
        for i in range(int):
            code += random.choice(list)

        return code

    # 纯获取数字验证码  -------------------------------------------------------------
    @classmethod
    def int_sequence(cls, int=6):
        cls.__list_append()     # 列表添加元素

        # 获取列表的元素
        return cls.get_list_element(cls.__int_list, int)

    # 获取纯字母验证码  -------------------------------------------------------------
    @classmethod
    def str_sequence(cls, int=6):
        cls.__list_append()     # 列表添加元素

        # 获取列表的元素
        return cls.get_list_element(cls.__str_list, int)

    # 获取数字和字母验证码    --------------------------------------------------------
    @classmethod
    def verify_code(cls, int=6):
        cls.__list_append()     # 列表添加元素

        # 获取列表的元素
        return cls.get_list_element(cls.__all_list, int)


# 主函数   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def main():
    print(verify_code.int_sequence())
    print(verify_code.str_sequence())
    print(verify_code.verify_code())


# 代码测试  ==========================================================================
if __name__ == '__main__':
    main()

else:
    print(f'导入"{__name__}"模块')


4.图片文件:刷新.png(大小:20x20)

作者:周华

创作日期:2023/10/26

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

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

相关文章

HarmonyOS原生分析能力,即开即用助力精细化运营

数据分析产品对开发者的价值呈现在两个层面,第一个是产品的层面,可以通过数据去洞察用户的行为,从而找到产品的优化点。另外一个就是运营层面,可以基于数据去驱动,来实现私域和公域的精细化运营。 在鸿蒙生态上&#…

Mac用NTFS文件夹读写NTFS硬盘 NTFS能复制多大的文件

Mac作为一款备受欢迎的计算机操作系统,具备了许多令人惊叹的功能和特性。然而,对于一些Mac用户来说,使用NTFS格式的硬盘可能存在一些疑问。他们可能想知道Mac是否能够读写NTFS格式的硬盘,以及NTFS格式的硬盘是否有文件大小的限制。…

067:mapboxGL上传CSV文件,显示图形,导出为Geojson文件

第067个 点击查看专栏目录 本示例的目的是演示如何在vue+mapbox中上传CSV文件,显示图形,导出为Geojson文件。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果使用的csv文件配置方式示例源代码(共140行)安装依赖相关API参考:专栏目标示例…

CentOS 搭建本地 yum 源方式 安装 httpd 服务

CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容: /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…

如何用FLStudio水果21中文版创作音乐?(官方基础教程中文版)

本文讲的是FL Studio的界面和基础工作流程。简言之,FL Studio能让你载入乐器和音频采样,通过手动输入音符数据或实时弹奏来演奏它们;录制外部声音(比如用麦克风录音)然后通过调音台来回放整个混音(还能添加…

私有云:架构图

私有云:架构图 1、架构图2、服务器分配及配置3、本地物理机hosts文件配置4、相关软件包5、本地物理机电脑配置参考【内存最好20G往上】 机缘巧合之下突然想玩玩虚拟化,然后就查资料本地自己搭建一套私有云 使用【VMware Workstation】这个虚拟化软件来进…

Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)

目录 一、概述 二、具体配置如下: 一、概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途&…

状态模式-对象状态及其转换

某信用卡业务系统,银行账户存在3种状态,且在不同状态下存在不同的行为: 1)正常状态(余额大等于0),用户可以存款也可以取款; 2)透支状态(余额小于0且大于-20…

旅游业热潮中的数字化转型,拓世AI数字人直播一体机重新定义酒店服务的未来

国内经济的快速发展使得居民的生活条件逐渐改善,我国居民人均可支配收入持续增多,居民消费能力和消费水平均同步提高。物质生活条件的持续改善使得人们精神层面的需求加速释放,旅游需求迅速增多。人们出游意愿强烈,旅游行业复苏加…

02 # 手写 instanceof 的原理

instanceof 干什么的&#xff1f; instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 instanceof 可以判断一个对象是否属于某个类 <script>function Person(name, age) {this.name name;this.age age;}Person.prototype.sayH…

基于springboot,vue学生宿舍管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vuevue-element-admin 服务端技术&#xff1a;springboot,mybatis…

【信创】银河麒麟V10 本地部署yum数据源

1. 下载银河麒麟系统ISO镜像文件。 https://fdoc.epoint.com.cn:3366/ISO/麒麟V10/ wget https://fdoc.epoint.com.cn:3366/ISO/麒麟V10/Kylin-Server-10-SP1-Release-Build19-20210319-x86.iso 一般这个镜像文件会默认放置在/home目录下&#xff0c;如图&#xff1a; 挂载到…

数学分析:傅里叶三角级数

贝塞尔不等式&#xff0c;就是勾股定理。不过要注意&#xff0c;因为他们的基并不是单位基&#xff0c;所以系数做过缩放。 三角级数的复形式。 通过复形式&#xff0c;可以进一步化简。 因为是等比数列&#xff0c;最终可以得到一个很好的地理克雷核。 这个引理的意思是&#…

flinksql kafka到mysql累计指标练习

flinksql 累计指标练习 数据流向&#xff1a;kafka ->kafka ->mysql 模拟写数据到kafka topic&#xff1a;wxt中 import com.alibaba.fastjson.JSONObject; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Produ…

数据结构—线性表(下)

文章目录 6.线性表(下)(4).栈与队列的定义和ADT#1.ADT#2.栈的基本实现#3.队列的形式#4.队列的几种实现 (5).栈与队列的应用#1.栈的应用i.后缀表达式求值ii.中缀表达式转后缀表达式 #2.队列的应用 (6).线性表的其他存储方式#1.索引存储#2.哈希存储i.什么是哈希存储ii.碰撞了怎么…

windows 安装小乌龟

这是什么 这里简单描述一下在windows上如何安装GIT代码管理工具和使用小乌龟版本来调用GIT&#xff0c;并且配置一下git相关信息&#xff0c;可以使用小乌龟来操作代码。也有一些常规git使用方法。 需要的资源 Git-2.42.0-64-bit.exe&#xff08;这个是git代码管理工具&…

Redis集群搭建真的很简单

背景 很多小伙伴在学习redis的时候都只在windows上搭建过redis&#xff0c;然后工作之后也只是在应用redis。那么redis在Linux上如何搭建呢&#xff1f;集群如何搭建呢&#xff1f;本文不讲原理&#xff0c;只讲实际操作。真的很简单。 环境 Linux-Ubuntu 20.04.6 LTS x86_6…

Flink Hive Catalog操作案例

在此对Flink读写Hive表操作进行逐步记录&#xff0c;需要指出的是&#xff0c;其中操作Hive分区表和非分区表的DDL有所不同&#xff0c;以下分别记录。 基础环境 Hive-3.1.3 Flink-1.17.1 基本操作与准备 1、上传依赖jar包到flink/lib目录下 cp flink-sql-connector-hive-…

C++设计模式_14_Facade门面模式

本篇介绍的Facade门面模式属于“接口隔离”模式的一种&#xff0c;以下进行详细介绍。 文章目录 1. “接口隔离”模式1. 1 典型模式 2. 系统间耦合的复杂度3. 动机(Motivation)4. 模式定义5. Facade门面模式的代码实现6. 结构7. 要点总结8. 其他参考 1. “接口隔离”模式 在组…

聚焦养老主业,平安养老险构建一体化养老生态圈

10月23日&#xff0c;是我们国家的传统节日重阳节&#xff0c;这一天也在1989年被我国政府正式定为“中国老人节”&#xff0c; 按照我国将60岁及以上人群定义为老年人的标准来看&#xff0c;我国老年人的占比已经达到了20%。根据国家统计局2022年度统计公报数据显示&#xff0…