这篇是用Tkinter做的注册界面的案例,代码里有许多验证的判断,还没有完全写完,主要实现密码加密写入字典,这里用到了之前的一篇MD5加密的方法点击查看,点注册后密码通过哈希MD5加密写入文本文件,可以看到字典中的密码是加密的,可以确保用户信息的安全
待完善的不足:用相同的用户名注册时,会记录最后一条注册的用户名和密码,这也是字典的特性,键的唯一性,但值可以任意。
解决办法:注册时遍历字典中的键,如果存在相同则不允许注册
上面画红线的就是密码"abc12345"的MD5值
上图是写入后的用户名和密码,因为需要转化为字典键值对的形式,所以中间用制表符Tab键分隔开,再用split方法分隔成键和值即可
上图是点击读出账户信息后以字典形式打印文本文件中的内容
from tkinter import *
from tkinter import messagebox
import hashlib
root = Tk()
root.title("注册窗口演示")
root.geometry("400x250")
root.resizable(0, 0)
f1 = Frame(root)
f1.pack()
l1 = Label(f1, text="用户名").grid(row=0, column=0)
l2 = Label(f1, text="输入密码").grid(row=1, column=0)
l2 = Label(f1, text="再次确认").grid(row=2, column=0)
def change():
username.config(bg="white")
password.config(bg="white")
password_.config(bg="white")
return True
username = Entry(f1,validate="key",validatecommand=change)#输入用户名
username.grid(row=0, column=1, pady=20)
password = Entry(f1,validate="key",validatecommand=change)#输入密码
password.grid(row=1, column=1)
password_ = Entry(f1,validate="key",validatecommand=change)#再次确认密码
password_.grid(row=2, column=1)
def register():
if username.get() == "":
username.config(bg="Crimson")
messagebox.showerror("提示", "用户名不能为空")
elif password.get() != password_.get():
password.config(bg="Crimson")
password_.config(bg="Crimson")
password_.delete(0,END)
messagebox.showerror("提示", "两次密码输入不一致")
elif password.get() == password_.get():
'''
这里就是自定义的MD5加密,实例化对象必须写在一个函数里,
否则加密后的同样字符串每次会出现不一样的情况
'''
m = hashlib.md5("欢乐海岸".encode("utf-8"))
m.update(password.get().encode("utf-8"))
f = open("D:\\账户信息.txt", mode="a", encoding="utf-8")
f.write(username.get() + "\t" + m.hexdigest() + "\n")
print(m.hexdigest())
f.close()
messagebox.showinfo("提示", "注册成功")
Button(f1, text="注册", width=10, command=register).grid(row=3, column=0, sticky=W, pady=5)
Button(f1, text="退出", width=10, command=root.quit).grid(row=3, column=1, sticky=E, pady=5)
def readinfo():
f = open("D:\\账户信息.txt", mode="r", encoding="utf-8")
information = f.readlines()
D = {
} #创建空字典,放用户名和密码
for i in range(len(information)):
D[information[i].split("\t")[0]] = information[i].split("\t")[1][0:-1] #以tab键分隔,去掉末尾的换行符\n,用户名和密码加入字典中
print(D)
f.close()
Button(f1, text="读出账户信息", width=10, command=readinfo).grid(row=4, column=1, sticky=E, pady=5)
root.mainloop()