本文共 2805 字,大约阅读时间需要 9 分钟。
昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码。当然了,这件事也给了我一个警示,那就是定期的更换自己的QQ密码,会比较的安全。
然后就自己写了个密码保护的小工具。虽然我们没有必要写这么个程序,但是为了复习巩固一下之前学过的知识,还是做点什么吧。
本实验是基于Python来实现,使用Tkinter来写的界面。
以当前月份为算子来获取md5加密后的随机字符串来作为密码。
# coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')# __author__ = '郭 璞'# __date__ = '2016/9/13'# __Desc__ = 根据月份生成不同的密码from hashlib import md5from time import *from Tkinter import *# 获取当前月 月份def getMonth(): month_ = localtime().tm_mon return month_# 根据口令来返回密码或者错误信息def generatepassword(password): print password if password == "芝麻开门": full = md5(str(getMonth())).hexdigest() month = getMonth() return str('QQ密码:').encode('gbk')+str(full[month:month+10]) else: return "╭(╯^╰)╮,不给密码".encode('gbk')# 此函数的神奇之处就在于能够实时的更新密码结果区域的内容def updatestate(pswd,kouling): result = generatepassword(kouling) print result.decode('gbk') print "-----------------------" pswd.set(result.decode('gbk'))# 界面形式来展示def showresult(): tk = Tk() # 记录用户输入信息 kouling = StringVar() # 记录密码信息 pswd = StringVar() pswd.set('密码待显区') frame1 = Frame(tk) Label(frame1, text='输入口令').pack(side=LEFT, expand=YES) Entry(frame1, textvariable=kouling).pack() frame1.pack(side=TOP) frame2 = Frame(tk) Label(frame2, text='本次密码').pack(side=LEFT, expand=YES) Entry(frame2, textvariable=pswd,state='readonly').pack() frame2.pack(side=TOP) frame3 = Frame(tk) btn_pull = Button(frame3, text='获取密码', command=lambda: updatestate(pswd,kouling.get())) # btn_pull.bind(citycode.get(),update_weather) btn_pull.pack(side=LEFT, expand=YES) btn_quit = Button(frame3, text='退出', command=tk.quit).pack(side=LEFT, expand=YES) frame3.pack(side=TOP) tk.mainloop()if __name__ == '__main__': showresult()
相信大家也都看到了,代码部分多了许多的encode和decode的部分。这是因为,我们要想在终端界面上显示信息的话,需要对编码进行处理。
而我们的Python代码中有这样的一句话。
# coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')
其作用就是告诉解释器要以UTF-8的形式保存和读取源文件。
如果不这样做的话,我们就会出现下面这种乱码的情况。更多关于编码,乱码的信息,不妨看下博主之前总结的一篇文章。
虽然Tkinter作为一套界面开发套件很不错,但是事件处理方面和swing或者mfc,C#有一定的差别的。 比方说,我们不能再一个方法内激活本方法,否则将导致递归异常,无法实现界面的更新。
由于本例需要用户输入来决定输出,所以肯定需要动态的修改界面信息的。因此博主采用了在外边重新定义一个新函数的方式来实现。
def updatestate(pswd,kouling): result = generatepassword(kouling) print result.decode('gbk') print "-----------------------" pswd.set(result.decode('gbk'))
这样,我们在Tkinter的button点击事件中就可以做到根据用户输入来决定输出了。
frame3 = Frame(tk) # 此处为点击事件核心 btn_pull = Button(frame3, text='获取密码', command=lambda: updatestate(pswd,kouling.get())) btn_pull.pack(side=LEFT, expand=YES) btn_quit = Button(frame3, text='退出', command=tk.quit).pack(side=LEFT, expand=YES) frame3.pack(side=TOP)
回顾一下,本实验所得。