Python 使用tkinter设计Windows网页或应用的用户注册登录界面

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

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Python Tkinter是一个用于创建图形用户界面(GUI)的Python库。它可以用来创建各种类型的应用程序,包括登录注册界面。在Tkinter中,我们可以使用各种小部件(widgets)来创建GUI,例如按钮(buttons)、标签(labels)、文本框(text boxes)等等。对于登录注册界面,我们可以使用文本框来输入用户名和密码,使用按钮来提交登录或注册请求。同时,我们还可以使用标签来显示错误信息或成功信息。总之,Python Tkinter是一个非常强大的工具,可以帮助我们轻松地创建各种类型的GUI应用程序。 ### 回答2: Python Tkinter是一个用于创建GUI的Python标准库。它提供了一个简单和易于使用的框架,可用于使用各种GUI工具包来创建不同类型的Python应用程序。在本文中,我将介绍如何创建一个Python Tkinter登录注册界面。 首先,我们需要安装Python Tkinter库。在Python环境中,可以使用以下命令在终端中安装Tkinter: ```python pip install tk ``` 接下来,我们将创建一个文件名为“login.py”的Python脚本,并按以下方式编写代码: ```python import tkinter as tk root = tk.Tk() root.title("登录界面") # 创建标签框架和标签 frame_user = tk.Frame(root) label_user = tk.Label(frame_user, text="用户名:") entry_user = tk.Entry(frame_user, width=25) frame_pwd = tk.Frame(root) label_pwd = tk.Label(frame_pwd, text="密码:") entry_pwd = tk.Entry(frame_pwd, width=25) frame_user.pack(side="top", pady=10) label_user.pack(side="left") entry_user.pack(side="left") frame_pwd.pack(side="top", pady=10) label_pwd.pack(side="left") entry_pwd.pack(side="left") # 创建按钮 frame_btn = tk.Frame(root) button_register = tk.Button(frame_btn, text="注册") button_login = tk.Button(frame_btn, text="登录") button_register.pack(side="left") button_login.pack(side="left", padx=10) frame_btn.pack(side="top", pady=20) root.mainloop() ``` 代码中,我们首先导入Tkinter库,然后创建一个名为root的Tkinter对象实例,它表示GUI的主窗口。设置窗口的标题为“登录界面”。 然后,我们创建两个标签框架,一个用于用户名和另一个用于密码。在每个框架中,我们创建一个标签和一个输入框,并使用pack()方法将它们打包在一起。 最后,我们在一个按钮框架中创建两个按钮,一个用于注册,另一个用于登录,然后将它们打包在一起。使用mainloop()方法显示GUI窗口并等待用户输入。 接下来,我们需要对登录和注册按钮添加点击事件的处理程序。我们将使用lambda函数在单击按钮时调用这些处理程序。例如,我们在单击登录按钮时可以执行以下操作: ```python def login(): user = entry_user.get() pwd = entry_pwd.get() if user == "admin" and pwd == "123456": print("登录成功") else: print("登录失败") button_login.config(command=lambda: login()) ``` 在此代码段中,我们创建了一个login()函数来处理登录操作。该函数获取用户名和密码输入框的值,然后将其与某些预定义值进行比较。如果匹配,则打印“登录成功”,否则打印“登录失败”。 最后,我们使用config()方法将按钮的command属性设置为lambda函数,该函数将调用login()函数。使用相同的方式来处理注册按钮的事件并执行相应的操作。 至此,我们的Python Tkinter登录注册界面完成。这个小项目可以帮助初学者熟悉Python Tkinter库,并在实际应用使用它,同时实现了登录和注册的基本功能。 ### 回答3: PythonTkinter库是一个快速简单创建GUI界面的工具,它可以在Windows、OS X和Linux等多个平台上运行。 针对登录注册界面,我们可以采用Tkinter进行界面设计。首先需要导入Tkinter模块,然后定义一个界面窗口。接着,设置窗口标题、窗口大小等参数。在窗口中添加用户名和密码的输入框,以及注册和登录按钮。并且,设置相关按钮的事件响应函数。 对于登录操作,在响应函数中应该对用户输入的用户名和密码进行判断,如果存在该用户名且密码正确,则跳转到对应的主界面,否则应该提示用户重新输入。而针对注册操作,在响应函数中需要对用户输入的用户名和密码进行检查,不允许出现重复用户名。如果检查通过,将该用户名和密码保存,并提示用户注册成功。 在代码实现方面,我们根据上述过程进行编码。示例代码如下: ``` from tkinter import * root = Tk() root.title("登录/注册") # 设置窗口大小和初始位置 width = 400 height = 300 screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() align_top = (screenheight - height) / 2 align_left = (screenwidth - width) / 2 root.geometry('%dx%d+%d+%d' % (width, height, align_left, align_top)) # 定义欢迎标签 welcome = Label(root, text="欢迎使用系统!", font=("宋体", 16)) welcome.pack() # 定义用户名输入框 name_label = Label(root, text="用户名:") name_label.place(x=50, y=70) name_entry = Entry(root, width=30) name_entry.place(x=110, y=70) # 定义密码输入框 pwd_label = Label(root, text="密 码:") pwd_label.place(x=50, y=110) pwd_entry = Entry(root, show="*", width=30) pwd_entry.place(x=110, y=110) # 定义登录操作响应函数 def login(): name = name_entry.get() pwd = pwd_entry.get() if name == "admin" and pwd == "123456": welcome.config(text="登录成功") # TODO 跳转到对应的主界面 else: welcome.config(text="用户名或密码错误") # 定义注册操作响应函数 def register(): name = name_entry.get() pwd = pwd_entry.get() with open("users.txt", "a+") as f: users = f.read().splitlines() if name in users: welcome.config(text="用户名已存在") else: f.write(name + " " + pwd + "\n") welcome.config(text="注册成功") # 定义登录和注册按钮 login_button = Button(root, text="登录", command=login) login_button.place(x=110, y=150) register_button = Button(root, text="注册", command=register) register_button.place(x=210, y=150) root.mainloop() ``` 上述代码实现了一个简单的登录注册界面,界面上部分为欢迎标签,中部分为用户名和密码输入框,底部为登录和注册按钮。登录响应函数对用户输入的用户名和密码进行判断,注册响应函数则将用户输入的用户名和密码保存到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值