登录系统——软件质量保证与测试期末大作业

啥也不会的说

先放一张流程图吧。
process on制作

其实期末作业没什么可说的。很多python代码来自网上的,自己修改了下。这学期寒假贪玩了很多,Java也没好好学,只能用python这样子。😂 Markdown也是第一次用,排版都不会。

# -- coding: GBK --
#一个基于thinker部件的登录与注册程序,加入了一些别的功能
#最后更新时间 2020.05.24
#作者@bluebonnet27 @宫浩泽

import random #随机
import pickle  # 存放数据的模块
import tkinter as tk
import tkinter.messagebox

#图像
from PIL import ImageTk, Image
window = tk.Tk()
window.title("注册登陆页面")
window.geometry("500x400")
 
canvas = tk.Canvas(window, height=500, width=500)
imgpath = 'denglu.gif'
img = Image.open(imgpath)
photo = ImageTk.PhotoImage(img)
image = canvas.create_image(0, 0, anchor='nw', image=photo)
canvas.pack()

a=str(random.randint(10,90))
b=str(random.randint(10,90))

tk.Label(window, text='用户名:').place(x=100, y=100)
tk.Label(window, text='密码:').place(x=100, y=150)
tk.Label(window, text='请在下面输入问题的正确答案').place(x=100, y=200)
tk.Label(window, text=a+'+'+b+'=').place(x=100, y=250)
         
var_usr_name = tk.StringVar()
#var_usr_name.set('请输入用户名')
 
var_usr_pwd = tk.StringVar()
#var_usr_pwd.set('请输入密码')

var_usr_judge = tk.StringVar()
#var_usr_judge.set('请再次输入密码')
 
entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
entry_usr_name.place(x=200, y=100)
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=200, y=150)
entry_usr_judge = tk.Entry(window, textvariable=var_usr_judge)
entry_usr_judge.place(x=200, y=250)
 
def usr_login():
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()
    usr_judge = var_usr_judge.get()
    try:
        with open("usrs_info.pickle", "rb") as usr_file: #注意这个地方用到了pickle可以百度一下使用方法
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        with open("usrs_info.pickle", "wb") as usr_file:  # with open with语句可以自动关闭资源
            usrs_info = {"admin": "admin"}  # 以字典的形式保存账户和密码
            pickle.dump(usrs_info, usr_file)
 
    if usr_name in usrs_info:
        #print(usr_judge)
        if usr_pwd == usrs_info[usr_name] and int(usr_judge) == (int(a)+int(b)):
            tk.messagebox.showinfo(title="登陆成功!", message="今天过得怎么样?" + usr_name)
        elif int(usr_judge) != (int(a)+int(b)):
            tk.messagebox.showerror(message="错误1,请检查验证码的输入!")
        else:
            tk.messagebox.showerror(message="错误2,请检查你的密码输入!")
    else:
        is_sign_up = tk.messagebox.askyesno("错误3", "你似乎还没有注册,要今天注册么?")
        if is_sign_up:
            usr_sign_up()
        else: 
            window.destroy()
 
 
def usr_sign_up():
    def sign_to_Python():
        signpwd = sign_pwd.get()
        signpwdconfirm = sign_pwd_confirm.get()
        signname = sign_name.get()
        #口令
        #signorder = sign_order.get()
        
        try:
            with open("usrs_info.pickle", "rb") as usr_file:
                exist_usr_info = pickle.load(usr_file)
        except FileNotFoundError:
            with open("usrs_info.pickle", "wb") as usr_file:  # with open with语句可以自动关闭资源
                exist_usr_info = {"admin": "admin"}  # 以字典的形式保存账户和密码
                pickle.dump(exist_usr_info, usr_file)
        if signpwd != signpwdconfirm:
            tk.messagebox.showerror("错误4", "两次输入的密码不一致!")
        elif signname in exist_usr_info:
            tk.messagebox.showerror("错误5", "这个用户已经注册了!你似乎忘记了你的密码。 ")
        else:
            exist_usr_info[signname] = signpwd
            with open("usrs_info.pickle", "wb") as usr_file:
                pickle.dump(exist_usr_info, usr_file)
 
            tk.messagebox.showinfo("欢迎", "注册成功!")
            # close window
            window_sign_up.destroy()
 
    window_sign_up = tk.Toplevel(window)
    window_sign_up.geometry("350x300")
    window_sign_up.title("注册页面")
 
    sign_name = tk.StringVar()
    sign_name.set('请输入用户名')
    tk.Label(window_sign_up, text="用户名:").place(x=10, y=10)
    entry_new_name = tk.Entry(window_sign_up, textvariable=sign_name)
    entry_new_name.place(x=150, y=10)
 
    sign_pwd = tk.StringVar()
    tk.Label(window_sign_up, text="密码:").place(x=10, y=50)
    entry_usr_pwd = tk.Entry(window_sign_up, textvariable=sign_pwd, show='*')
    entry_usr_pwd.place(x=150, y=50)
 
    sign_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text="确认密码:").place(x=10, y=90)
    entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=sign_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=150, y=90)
 
    btn_confirm_sign_up = tk.Button(window_sign_up, text="  创建  ", command=sign_to_Python)
    btn_confirm_sign_up.place(x=150, y=250)
 
 
# login and sign up
btn_login = tk.Button(window, text="  登录  ", command=usr_login)
btn_login.place(x=155, y=300)
 
btn_sign_up = tk.Button(window, text="  创建  ", command=usr_sign_up)
btn_sign_up.place(x=270, y=300)
 
window.mainloop()

#def catch_back_password():

实际上catch_back_password()是打算写一个密码找回程序的。实际上很多注释是这样的:本来想加一个新功能,但发现太费劲了,就把写了一半的代码注释掉了。

最后上交的时候,加了密码长度的限制和其他功能

最终版的代码如下:

# -- coding: GBK --
#一个基于thinker部件的登录与注册程序,加入了一些别的功能
#最后更新时间 2020-5-26 22:40:44
#作者@bluebonnet27 @宫浩泽

import random #随机
import pickle  # 存放数据的模块
import tkinter as tk #tk模块
import tkinter.messagebox #messagebox模块

#登录函数
def usr_login():
    pwd=''
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()
    usr_judge = var_usr_judge.get()

    #查找pickle文件,不存在则admin占位
    try:
        with open("usrs_info.pickle", "rb") as usr_file: 
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        with open("usrs_info.pickle", "wb") as usr_file:  
            usrs_info = {"admin": "admin"}  # 以字典的形式保存账户和密码
            pickle.dump(usrs_info, usr_file)
    
    if usr_name in usrs_info:
		
		#提取密码
        for i in usrs_info[usr_name]:
            if i=='|':
                break
            else:
                pwd=pwd+i
        print(pwd)
        
        #校验
        if usr_pwd == pwd and int(usr_judge) == (int(a)+int(b)):
            tk.messagebox.showinfo(title="登陆成功!", message="今天过得怎么样?" + usr_name)
        elif int(usr_judge) != (int(a)+int(b)):
            tk.messagebox.showerror(message="错误1,请检查验证码的输入!")
        else:
            tk.messagebox.showerror(message="错误2,请检查你的密码输入!")
    
    else:
        is_sign_up = tk.messagebox.askyesno("错误3", "你似乎还没有注册,要今天注册么?")
        if is_sign_up:
            usr_sign_up()
 
#注册函数 
def usr_sign_up():
    def sign_to_Python():
        signpwd = sign_pwd.get()
        signpwdconfirm = sign_pwd_confirm.get()
        signname = sign_name.get()
        signsp = sign_sp.get()
       
       #依然是文件确认,下回就不写注释了
        try:
            with open("usrs_info.pickle", "rb") as usr_file:
                exist_usr_info = pickle.load(usr_file)
        except FileNotFoundError:
            with open("usrs_info.pickle", "wb") as usr_file:  # with open with语句可以自动关闭资源
                exist_usr_info = {"admin": "admin"}  # 以字典的形式保存账户和密码
                pickle.dump(exist_usr_info, usr_file)
        
        #校验注册数据合法性
        if signpwd != signpwdconfirm:
            tk.messagebox.showerror("错误4", "两次输入的密码不一致!")
        elif '|' in signpwd or '|' in signsp :
            tk.messagebox.showerror("警告", "密码不要包含|字符,这是我们用来分割的!")
        elif len(signpwd)<4 :
            tk.messagebox.showerror("错误8", "输入的密码长度不可以小于4位!")
        elif len(signpwd)>8 :
            tk.messagebox.showerror("错误9", "输入的密码长度不可以大于8位!")
        elif len(signsp)>6 :
            tk.messagebox.showerror("错误9", "输入的二级密码长度不可以大于6位!") 
        elif len(signsp)<4 :
            tk.messagebox.showerror("错误8", "输入的二级密码长度不可以小于4位!")
        elif signname in exist_usr_info:
            tk.messagebox.showerror("错误5", "这个用户已经注册了!你似乎忘记了你的密码。 ")
        
        #没问题后写入数据
        else:
            exist_usr_info[signname]=signpwd+'|'+signsp
            with open("usrs_info.pickle", "wb") as usr_file:
                pickle.dump(exist_usr_info, usr_file)
 
             #欢迎程序
            tk.messagebox.showinfo("欢迎", "注册成功!")
            # 关闭窗口
            window_sign_up.destroy()
 
    #绘制注册界面
    window_sign_up = tk.Toplevel(window)
    window_sign_up.geometry("350x300")
    window_sign_up.title("注册页面")

    #用户名,密码,二级密码输入框
    sign_name = tk.StringVar()
    sign_name.set('请输入用户名')
    tk.Label(window_sign_up, text="用户名:").place(x=10, y=10)
    entry_new_name = tk.Entry(window_sign_up, textvariable=sign_name)
    entry_new_name.place(x=150, y=10)
 
    sign_pwd = tk.StringVar()
    tk.Label(window_sign_up, text="密码(4-8位)").place(x=10, y=50)
    entry_usr_pwd = tk.Entry(window_sign_up, textvariable=sign_pwd, show='*')
    entry_usr_pwd.place(x=150, y=50)
 
    sign_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text="确认密码:").place(x=10, y=90)
    entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=sign_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=150, y=90)

    sign_sp = tk.StringVar()
    tk.Label(window_sign_up, text="为方便您找回密码").place(x=10, y=130)
    entry_usr_sp = tk.Entry(window_sign_up, textvariable=sign_sp, show='*')
    tk.Label(window_sign_up, text="请输入二级密码(4-6位):").place(x=10, y=170)
    entry_usr_sp = tk.Entry(window_sign_up, textvariable=sign_sp, show='*')
    entry_usr_sp.place(x=150, y=170)
 
    btn_confirm_sign_up = tk.Button(window_sign_up, text="  创建  ", command=sign_to_Python)
    btn_confirm_sign_up.place(x=150, y=250)

#重置密码函数 
def usr_sign_sp():
    sp=''
    
    def sign_to_python():
        count=0
        signpwd = sign_pwd.get()
        signpwdconfirm = sign_pwd_confirm.get()
        signname = sign_name.get()
        signsp = sign_sp.get()
        
        try:
            with open("usrs_info.pickle", "rb") as usr_file:
                exist_usr_info = pickle.load(usr_file)
        except FileNotFoundError:
            with open("usrs_info.pickle", "wb") as usr_file:  # with open with语句可以自动关闭资源
                exist_usr_info = {"admin": "admin"}  # 以字典的形式保存账户和密码
                pickle.dump(exist_usr_info, usr_file)
        
        #读取存储的二级密码
        for i in exist_usr_info[signname]:
                count+=1
                if i=='|':
                    sp=exist_usr_info[signname][count:]
                    print(sp)
                    break
        
        #校验重置密码输入数据的合法性
        if signpwd != signpwdconfirm:
            tk.messagebox.showerror("错误4", "两次输入的密码不一致!")
        elif signsp!=sp:
            tk.messagebox.showerror("错误6", "你的二级密码错误!请重新输入! ")
        elif len(signpwd)<4 :
            tk.messagebox.showerror("错误8", "输入的密码长度不可以小于4位!")
        elif len(signpwd)>8 :
            tk.messagebox.showerror("错误9", "输入的密码长度不可以大于8位!")
        elif len(signsp)>6 :
            tk.messagebox.showerror("错误9", "输入的二级密码长度不可以大于6位!") 
        elif len(signsp)<4 :
            tk.messagebox.showerror("错误8", "输入的二级密码长度不可以小于4位!")
        elif signname not in exist_usr_info:
            tk.messagebox.showerror("错误7", "用户名错误! ")
        elif '|' in signpwd or '|' in signsp :
            tk.messagebox.showerror("警告", "密码不要包含|字符,这是我们用来分割的!")
        
        #数据没有问题,可以重置了
        else:            
            exist_usr_info[signname]=signpwd+'|'+signsp
            print(signpwd+signsp)
            with open("usrs_info.pickle", "wb") as usr_file:
                pickle.dump(exist_usr_info, usr_file)
            
            #弹出重置成功的欢迎
            tk.messagebox.showinfo("欢迎", "重置成功!")
            #关闭窗口
            window_sign_up.destroy()
    
    #重置密码的相关绘图指令         
    window_sign_up = tk.Toplevel(window)
    window_sign_up.geometry("350x300")
    window_sign_up.title("重置密码页面")
    
    sign_name = tk.StringVar()
    sign_name.set('请输入用户名')
    tk.Label(window_sign_up, text="用户名:").place(x=10, y=10)
    entry_new_name = tk.Entry(window_sign_up, textvariable=sign_name)
    entry_new_name.place(x=150, y=10)
    
    sign_pwd = tk.StringVar()
    tk.Label(window_sign_up, text="新密码(4-8位):").place(x=10, y=50)
    entry_usr_pwd = tk.Entry(window_sign_up, textvariable=sign_pwd, show='*')
    entry_usr_pwd.place(x=150, y=50)
 
    sign_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text="确认密码:").place(x=10, y=90)
    entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=sign_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=150, y=90)

    sign_sp = tk.StringVar()
    tk.Label(window_sign_up, text="请输入二级密码(4-6位):").place(x=10, y=130)
    entry_usr_sp = tk.Entry(window_sign_up, textvariable=sign_sp, show='*')
    entry_usr_sp.place(x=150, y=130)

    btn_confirm_sign_up = tk.Button(window_sign_up, text="  创建  ", command=sign_to_python)
    btn_confirm_sign_up.place(x=150, y=250)



#图像
from PIL import ImageTk, Image
import os

#主窗口
window = tk.Tk()
window.title("注册登陆页面")
window.geometry("500x400")

#gif背景
class MyLabel(tk.Label): 
    def __init__(self, master, filename):
        im = Image.open(filename)
        seq = []
        try:
            while 1:
                seq.append(im.copy())
                im.seek(len(seq))
        except EOFError:
            pass
        try:
            self.delay = im.info['duration']
        except KeyError:
            self.delay = 100

        first = seq[0].convert('RGBA')
        self.frames = [ImageTk.PhotoImage(first)]

        tk.Label.__init__(self, master, image=self.frames[0])
        temp = seq[0]

        for image in seq[1:]:
            temp.paste(image)
            frame = temp.convert('RGBA')
            self.frames.append(ImageTk.PhotoImage(frame))
        self.idx = 0
        self.cancel = self.after(self.delay, self.play)
    def play(self):
        self.config(image=self.frames[self.idx])
        self.idx += 1
        if self.idx == len(self.frames):
            self.idx = 0
        self.cancel = self.after(self.delay, self.play)   

#读取绘制gif
anim = MyLabel(window, 'denglu.gif') 
anim.pack() 

#随机数产生
a=str(random.randint(10,90))
b=str(random.randint(10,90))

#窗口静态文字绘制
tk.Label(window, text='用户名:').place(x=100, y=100)
tk.Label(window, text='密码:').place(x=100, y=150)
tk.Label(window, text='请在下面输入问题的正确答案').place(x=100, y=200)
tk.Label(window, text=a+'+'+b+'=').place(x=100, y=250)

#输入感知         
var_usr_name = tk.StringVar()
var_usr_pwd = tk.StringVar()
var_usr_judge = tk.StringVar()

entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
entry_usr_name.place(x=200, y=100)
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=200, y=150)
entry_usr_judge = tk.Entry(window, textvariable=var_usr_judge)
entry_usr_judge.place(x=200, y=250)

# 交互按钮
btn_login = tk.Button(window, text="  登录  ", command=usr_login)
btn_login.place(x=150, y=300)
 
btn_sign_up = tk.Button(window, text="  注册  ", command=usr_sign_up)
btn_sign_up.place(x=270, y=300)

btn_sign_sp = tk.Button(window, text="  重置密码  ", command=usr_sign_sp)
btn_sign_sp.place(x=350, y=350)

window.mainloop()

需要文件夹目录下有一张denglu.gifGIF图片,然后数据是用pickle文件存储的。

赞赏