目录
一、前言
二、系统功能
1.注册账户
2.找回密码
3.登录系统
三、总结
在写大作业的时候需要用到一个登录界面,我的第一反应就是去C站参考参考兄弟们的想法。本来是找到了几个不错的登录界面的,但可恨的是没有源码,这让我感觉自己被调戏了。只给图片不给源码,这合适吗?这显然不合适啊。索性我就自己写了一个,虽然这个登录系统功能比较简单,但应付学校的大作业还算凑合吧。
我本人用的是Python3.8.9,用的了一个叫作PySimpleGUI的包,如果你的电脑里没有安装的话可以在命令行模式中输入以下内容进行安装:
pip install PySimpleGUI
首先要导入PySimpleGUI库和设置二级密码
import PySimpleGUI as sg
# 设置二级密码问题
question = {
'1': '您父亲的名字是什么?',
'2': '您母亲的名字是什么?',
'3': '对你影响最大的老师的名字是什么?',
'4': '你最喜欢的美食是什么?',
'5': '你最喜欢的运动是什么?'
}
在注册界面,用户可以注册一个新的账号,并且可以选择一个二级密码供以后找回密码使用。注册后的用户信息存储在文件中。
注册函数的代码:
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
用户如果忘记自己的密码,点击“忘记密码”按钮进入找回密码界面。首先输入自己的用户名,然后回答问题(也就是二级密码)。如果回答正确。则允许修改密码,否则就提示用户密码错误。
找回密码函数的代码:
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()
这是本登录系统的主界面,用户在账号栏里输入自己的用户名,然后再密码栏输入密码。如果密码正确则进入游戏,否则会提示用户密码错误。用户也可以从这个界面进入注册界面、找回密码界面和退出游戏。额,写到这才发现自己没有实现修改密码的功能,不过我想把找回密码的函数改改应该就可以了,肯定难不倒兄弟们。
登录成功的话就会显示缓冲界面然后进入游戏(在这没游戏,只有登录系统)
如果没成功的话那就重新登陆吧
登录函数的代码:
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()函数就可以了。嗯嗯, 基本就是这个样子了,源码都在上面,兄弟们可以适当进行一些升级改进,比如说注销用户、限制密码的格式、限制错误输入的次数、增加二级密码的数量等等。