啥也不会的说
先放一张流程图吧。
其实期末作业没什么可说的。很多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.gif
GIF图片,然后数据是用pickle文件存储的。