用Python实现一个简易的登录界面(附带源码)

目录

一、前言

二、系统功能

1.注册账户

2.找回密码

3.登录系统

三、总结


一、前言

         在写大作业的时候需要用到一个登录界面,我的第一反应就是去C站参考参考兄弟们的想法。本来是找到了几个不错的登录界面的,但可恨的是没有源码,这让我感觉自己被调戏了。只给图片不给源码,这合适吗?这显然不合适啊。索性我就自己写了一个,虽然这个登录系统功能比较简单,但应付学校的大作业还算凑合吧。

        我本人用的是Python3.8.9,用的了一个叫作PySimpleGUI的包,如果你的电脑里没有安装的话可以在命令行模式中输入以下内容进行安装:

pip install PySimpleGUI

首先要导入PySimpleGUI库和设置二级密码

import PySimpleGUI as sg

# 设置二级密码问题
question = {
    '1': '您父亲的名字是什么?',
    '2': '您母亲的名字是什么?',
    '3': '对你影响最大的老师的名字是什么?',
    '4': '你最喜欢的美食是什么?',
    '5': '你最喜欢的运动是什么?'
}

二、系统功能

1.注册账户

        在注册界面,用户可以注册一个新的账号,并且可以选择一个二级密码供以后找回密码使用。注册后的用户信息存储在文件中。

 注册函数的代码:

def Enrool():
    # 以字符串的形式显示二级密码问题
    question_str = '''
    1:您父亲的名字是什么?
    2:您母亲的名字是什么?
    3:对你影响最大的老师的名字是什么?
    4:你最喜欢的美食是什么?
    5:你最喜欢的运动是什么?
    '''
    # 设置显示屏幕的内容
    screen = [
        [sg.Txt("请输入你的信息:")],
        [sg.Txt("请输入昵称:", size=(15, 1)), sg.InputText("", tooltip="请输入昵称", key="-user_id-")],
        [sg.Txt("请输入密码", size=(15, 1)), sg.InputText("", tooltip="请输入密码", key="-pwd-")],
        [sg.Txt("请再次输入密码", size=(16, 1)), sg.InputText("", tooltip="再次确认密码", key="-pwds-")],
        [sg.Txt('请选择二级密码并输入答案:'), sg.InputText('', tooltip='二级密码序号', key='-pd2id-', size=(4, 1)),
         sg.InputText('', tooltip='答案', key='-pd2-', size=(10, 1)), sg.Button('查看二级密码类型')],
        [sg.Button("提交"), sg.Button('退出')]
    ]
    # 显示注册界面
    enroll_window = sg.Window("注册账户", screen)
    # 设置窗口的活跃参数
    look_window_active = False
    pdno_window_active = False
    while True:
        # 读取用户输入
        event, values = enroll_window.read()
        if event == "提交":
            # 取得用户输入的各个值
            user_id = values['-user_id-']
            user_passwd = values["-pwd-"]
            user_passwds = values["-pwds-"]
            user_pd2id = values['-pd2id-']
            user_pd2 = values['-pd2-']
            # 判断两次输入的密码是否相同
            if user_passwd == user_passwds:
                with open("用户信息.txt", 'a', encoding='utf-8') as f:
                    f.write(user_id + ' ' + user_passwd + ' ' + user_pd2id + ' ' + user_pd2 + ' ' + '0' + '\n')
                    f.close()
                enroll_window.close()
                break
            elif not pdno_window_active:
                # 如果两次输入的密码不一样则提示用户
                pdno_window_active = True
                lst = [
                    [sg.Txt("两次输入的密码不一致!")],
                    [sg.Button("确认")]
                ]
                pdno_window = sg.Window("请重新输入", lst)
                event, values = pdno_window.read()
                if event == "确认":
                    pdno_window_active = False
                    pdno_window.close()
        if not look_window_active and event == '查看二级密码类型':
            # 输出所有的二级密码
            look_window_active = True
            lst_pd = [[sg.Txt(question_str)],
                      [sg.Button('OK')]]

            look_window = sg.Window('二级密码', lst_pd, keep_on_top=True)

        if look_window_active:
            event, values = look_window.read()
            if event == 'OK':
                look_window_active = False
                look_window.close()
        if event == '退出':
            # 退出游戏
            enroll_window.close()
            break

2.找回密码

        用户如果忘记自己的密码,点击“忘记密码”按钮进入找回密码界面。首先输入自己的用户名,然后回答问题(也就是二级密码)。如果回答正确。则允许修改密码,否则就提示用户密码错误。

找回密码函数的代码:

def Reset_passwd(user_name, user_passwd, user_pd2id, user_pd2, user_score):
    # 重置密码
    with open("用户信息.txt", 'r', encoding='utf-8') as f:
        # 先读取所有用户的信息
        lines = f.readlines()
    with open("用户信息.txt", 'w', encoding='utf-8') as f:
        # 然后再重新写入
        for l in lines:
            if user_name == l[:len(user_name)]:
                f.write(user_name + ' ' + user_passwd + ' ' + user_pd2id + ' ' + user_pd2 + ' ' + user_score + '\n')
            else:
                f.write(l)
    return


def Recall_passwd():
    # 找回密码
    layout = [[sg.Txt("请输入用户名:"), sg.InputText('', key='name')],
              [sg.Button('确定')]]
    re_window = sg.Window('找回密码', layout)
    # 读用户信息
    event, values = re_window.read()
    if event == '确定':
        user_name = values['name']
        with open("用户信息.txt", 'r', encoding='utf-8') as f:
            user = f.readline()
            while len(user) != 0:
                user_id, user_passwd, user_pd2id, user_pd2, user_score = user.split()
                if user_id == user_name:
                    # 通过用户名找到忘记密码的用户
                    re_window.close()
                    layout = [[sg.Txt(question[user_pd2id]), sg.InputText('', key='pd2')],
                              [sg.Button('确定'), sg.Button('退出')]]
                    # 显示回答二级密码问题的窗口
                    re2_window = sg.Window('找回密码', layout)
                    event, values = re2_window.read()
                    if event == '确定':
                        if user_pd2 == values['pd2']:
                            re2_window.close()
                            lst = [[sg.Txt("请输入密码", size=(15, 1)), sg.InputText("", tooltip="请输入密码", key="-pwd-")],
                                   [sg.Txt("请再次输入密码", size=(16, 1)),
                                    sg.InputText("", tooltip="再次确认密码", password_char="*", key="-pwds-")],
                                   [sg.Button("提交"), sg.Button('退出')]]
                            # 二级密码通过,显示重置密码的窗口
                            reset_window = sg.Window('重置密码', lst)
                            while True:
                                event, values = reset_window.read()
                                if event == "提交":
                                    user_passwd = values["-pwd-"]
                                    user_passwds = values["-pwds-"]
                                    if user_passwd == user_passwds:
                                        f.close()
                                        Reset_passwd(user_name, user_passwd, user_pd2id, user_pd2, user_score)
                                        reset_window.close()
                                        return
                                    else:
                                        # 两次密码输入不一致,则提醒用户
                                        sg.popup_auto_close('两次输入的密码不一致', auto_close_duration=2)

                        else:
                            # 二级密码回答错误,提醒用户
                            sg.popup_auto_close('答案错误!', auto_close_duration=2)
                            re2_window.close()
                    if event == '退出':
                        # 直接退出游戏
                        re2_window.close()
                        return
                else:
                    user = f.readline()
            f.close()

3.登录系统

        这是本登录系统的主界面,用户在账号栏里输入自己的用户名,然后再密码栏输入密码。如果密码正确则进入游戏,否则会提示用户密码错误。用户也可以从这个界面进入注册界面、找回密码界面和退出游戏。额,写到这才发现自己没有实现修改密码的功能,不过我想把找回密码的函数改改应该就可以了,肯定难不倒兄弟们。

登录成功的话就会显示缓冲界面然后进入游戏(在这没游戏,只有登录系统)

如果没成功的话那就重新登陆吧

 登录函数的代码:

def login():
    # 登录函数
    sg.theme_button_color("red")
    sg.theme_text_element_background_color("white")
    sg.theme_background_color("gray")
    sg.theme_text_color("black")
    sg.theme_slider_color("yellow")
    layout = [
        [sg.Txt("请输入你的信息:")],
        [sg.Txt("账号", size=(8, 1)), sg.InputText("", key="-user-")],
        [sg.Txt("密码", size=(8, 1)), sg.InputText("", tooltip="请输入密码", password_char="*", key="-pwd-")],
        [sg.Button("登录"), sg.Button("注册"), sg.Button("忘记密码"), sg.Button("退出")],
        [sg.Txt("一身转战三千里,一剑曾当百万师!")]
    ]
    # 显示登录界面
    window = sg.Window("登录界面", layout)
    while True:
        flag = False
        # 读用户信息
        event, values = window.read()
        if event == "登录":
            with open("用户信息.txt", 'r', encoding='utf-8') as f:
                user = f.readline()
                while len(user) != 0:
                    user_id, user_passwd, user_pd2id, user_pd2, user_score = user.split()
                    if user_id == values['-user-'] and values['-pwd-'] == user_passwd:
                        # 密码正确,允许登录
                        flag = True
                        msg = "正在登录中,请稍后!"
                        lst = [[sg.Txt(msg)]]
                        window.close()
                        for i in range(1, 1024):
                            # 显示加载页面
                            sg.one_line_progress_meter('登录中', i + 1, 1024, '欢迎来到星际战争', '正在加载配置文件', orientation='h')
                        return [user_id, user_passwd, user_pd2id, user_pd2, user_score]
                    else:
                        user = f.readline()

                if flag == False:
                    # 密码错误,则提醒用户
                    lst = [[sg.Txt("密码或账号输入错误,请重新输入!")], [sg.Button("确认")]]
                    msg_window = sg.Window("请重新输入", lst)
                    event, values = msg_window.read()
                    if event == "确认":
                        msg_window.close()
                        continue

        if event == "注册":
            # 进入注册界面
            Enrool()
        if event == '忘记密码':
            # 进入找回密码界面
            Recall_passwd()
        if event == '退出':
            # 退出游戏
            break
    window.close()

三、总结

       使用的话,在你的主函数开始之前先调用以下login()函数就可以了。嗯嗯, 基本就是这个样子了,源码都在上面,兄弟们可以适当进行一些升级改进,比如说注销用户、限制密码的格式、限制错误输入的次数、增加二级密码的数量等等。

  • 12
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可乐喽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值