day1 作业编写登录窗口
Posted (野生程序员)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day1 作业编写登录窗口相关的知识,希望对你有一定的参考价值。
作业一:编写登录接口
(1)输入用户名和密码;
(2)认证成功后显示欢迎信息;
(3)输错三次后锁定。
思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而,数据库的知识还没有学习,因此我们要使用文件来保存文件。持久化保存数据信息,要保存在硬盘中。
(1)登陆,三次登陆锁定用户
用户信息文件 (用文件存储用户信息)
黑名单文件
1.黑名单检测,不让登陆
2.用户名密码判定
readme:
1.让用户输入用户名,首先在锁定列表中进行查找,查看用户是否进行锁定,如果用户没有在锁定文件中,那么在尝试看用户是否在用户文件中,如果输入的用户在文件中,则让用户输入密码,对密码进行判断,如果密码等于对应的用户的话就满足认证,让用户登陆成功,如果输入错误,则让用户重新输入,如果三次都没有成功,则锁定这个用户。
2.在上面的思路中,我们可以遍历文件,把用户的信息存放在一个字典中,到时候只需要根据用户输入的用户名作为键,然后匹配对应的密码,看是否与用户输入的密码等同即可。
3.我们也可以添加一个注册模块,如果用户不在用户文件中,则提示让注册,注册之后再登陆。
为此:我们采用两种方式进行尝试,一种是从上而下的编程;第二种是函数式编程方式:
流程图如下:
上面流程图是登录的过程,下面来编写代码:
#现有两个文件,一个lock_user,用于存储用户列表,一个lock_file用于锁定用户 #要想使用常规方法来造成多次输入的情况,必须使用while函数循环,为此,我们设置一个标识符,用来结束循环 active = True #设置标识符,用于结束真个循环,当我们想结束整个循环的时候,可以让表示符为false user_dic = {} #定义一个空字典,用于存储未锁定用户的用户名和密码 lock_dic = {} #定义一个用于存储锁定用户的空字典 i = 0 while active: username = input("Please input your name:") #让用户输入用户名 with open("lock_user","r") as f: #打开文件,并且遍历文件的每一行,用户把用户信息存储到字典中,以我们熟悉的方式处理 for line in f.readlines(): user,password = line.strip().split(":") #读取文件的每一行,并且分割字符串,生成用户名和密码存储在下面字典中 lock_dic[user] = password if username in lock_dic.keys(): #判断用户名是否在锁定列表中,如果在退出 print("对不起,你输入的用户名已经被锁定,请联系管理员......") break else: pass with open("user_list","r") as f1: #打开文件,目的是判断用户是否注册 for line1 in f1.readlines(): user1,pwd = line1.strip().split(":") user_dic[user1] = pwd while active: if username in user_dic: #判断用户是否注册,如果注册了,就让用户输入密码 if i < 3: #给用户三次机会 input_pwd = input("Pleae input your password:") if input_pwd == user_dic[username]: print("登录成功,欢迎回来!") exit() else: if i == 2: #如果第三次用户还没有输对,则把用户从用户文件移除到锁定文件中 print("对不起,你输入的次数过多,你的账户已经被锁定,请联系管理员") with open("lock_user", "a") as f3: f3.write("\\n%s:%s" % (username, user_dic[username])) with open("user_list","r+") as f4: lines = f4.readlines() if ("%s:%s\\n" %(username,user_dic[username])) in lines: lines.remove(("%s:%s\\n" %(username,user_dic[username]))) else: lines.remove(("%s:%s" %(username,user_dic[username]))) #逐行读取文件信息 f4.writelines(lines) active = False else: print("您还有%s次机会输入,如果都没输对,系统将索斯能够你的用户名" %(2-i)) i += 1 else: #如果用户没有注册,让用户这测,并且把注册后的用户添加到新的列表中 print("您输入的用户没有注册,请注册") log_user = input("Please input your login in name:") log_pwd = input("Please input your log password:") with open("user_list","a") as f2: f2.write("\\n%s:%s" %(log_user,log_pwd)) print("注册成功,欢迎您的加入!") active = False
上面代码中,主要用的是对文件的操作,文件的操作我掌握的还不是很熟练,另外我们在读取文件的时候,大家都经常遇到恶心的应该就是空行吧!我们在遍历文件的时候,如果使用split()方法分隔,遇到空行的时候会报错,因为分隔不了,没有参数提供给我们的变量,这个时候可以事先做个判断,而且文件的操作使用w+写读模式容易一不小心把后台文件内容清楚,被boss开除,因为文件的操作本人不是怎么喜欢。空行的问题可以使用if进行判断,如果遇到空行,回避掉。函数式编程程序如下:
import getpass #导入模块,用于让用户输入密码处于隐藏状态 def locked_user(username): #查看用户是否锁定 lock_users = [] #定义一个空的列表,用于存储锁定用户信息 with open("lock_file","r") as f: #打开文件 for line in f.readlines(): #逐行读取文件信息 if line.strip(): #对文件进行判断,判断是否是空行,因为空行的时候会报错 lock_user,lock_pwd = line.strip().split(":") #字符串分割,生成用户名和密码,用户名存放在一个列表中进行验证是否锁定 lock_users.append(lock_user) else: pass if username in lock_users: #用户在锁定列表中告诉用户已经锁定 print("您输入的用户已经被锁定,请联系管理员!") else: #用户没有锁定,返回用户名进行接下来用户是否注册的验证 return username def isregister(username): #验证是否注册 user_dic = {} #定义一个空字典,用于存放用户名和密码 users = [] #定义一个空的列表,用于存储用户名 with open("user_file","r") as f1: for line1 in f1.readlines(): if line1.strip(): users1,pwd1 = line1.strip().split(":") #字符串分割,生成用户名和密码 user_dic[users1] = pwd1 #生成用户名和密码字典 users.append(users1) #把用户名以及对应的密码存放在一个字典中 else: pass if username in user_dic.keys(): #判断用户名是否在用户列表中,在进行验证 i = 0 while i < 3: pwd = input("请输入你的用户密码:") if user_dic[username] == pwd: print("欢迎回来!") return False else: if i == 2: print("对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!") # 用户名锁定之后要把锁定用户添加到锁定列表中,从user_file中剔除 with open("user_file", "r+") as f3: lines = f3.readlines() num = users.index(username) lines.pop(num) f3.writelines(lines) with open("lock_file", "a") as f4: f4.write("\\n%s:%s" % (username, pwd)) return False else: print("您输入的密码不对,你还有%s次机会..." % (2 - i)) i += 1 else: #不在让用户注册 print("您输入的用户没有注册,请注册!") register(rigister_name = input("请输入你要注册的用户名:"),rigister_pwd = getpass.getpass("请输入您的密码")) def register(rigister_name,rigister_pwd): #用户注册账号,注册之后添加到用户列表中,且打印一条注册成功的消息,结束过程 with open("user_file","a") as f2: f2.write("\\n%s:%s" %(rigister_name,rigister_pwd)) print("注册成功,欢迎您!") return False active = True #定义一个标识符,用于开启结束循环 while active: username = input("请输入您的用户名::") locked_user(username) active = isregister(username)
上面代码基本上能够满足要求,能够验证是否锁定,是否注册,没有注册让用户注册,注册之后添加到用户列表中;注册输入密码,密码三次后锁定,从用户文件删除,添加到锁定文件;但是用户文件哪里有一点小bug,因为我不知道如何读取一个文件删除之后在添加,因为"w"模式打开文件后直接清空文件,他妈的,操。而"r+"模式打开后,如果在添加信息进去的话,之前的信息还存在。造成没有删除的用户重复。
在读取文件中也经常会遇到空格这种恶心的操作,真心不喜欢呀。不过可以使用if函数对空格进行判断,判断空格的位置。
以上是关于day1 作业编写登录窗口的主要内容,如果未能解决你的问题,请参考以下文章