Python+tkinter模拟“记住我”自动登录原理

2017-06-05 董付国 Python小屋 Python小屋

基本思路:如果某次登录成功,则创建临时文件记录有关信息,每次启动程序时尝试自动获取上次登录成功的信息并自动编写。本文主要演示思路,可根据实际系统中的需要进行改写,例如读取数据库并验证用户名和密码是否正确、对用户名和密码进行本地加密存储等等。

import tkinter
import tkinter.messagebox
import os
import os.path


# 获取Windows平台临时文件夹

path = os.getenv('temp')
filename = os.path.join(path, 'info.txt')


# 创建应用程序窗口
root = tkinter.Tk()

# 在窗口上创建标签组件
labelName = tkinter.Label(root,\
                          text='User Name:',\
                          justify=tkinter.RIGHT,\
                          width=80)
labelName.place(x=10, y=5, width=80, height=20)


# 创建字符串变量和文本框组件,同时设置关联的变量
varName = tkinter.StringVar(root, value='')
entryName = tkinter.Entry(root,\
                          width=80,\
                          textvariable=varName)
entryName.place(x=100, y=5, width=80, height=20)


labelPwd = tkinter.Label(root,\
                         text='User Pwd:',\
                         justify=tkinter.RIGHT,\
                         width=80)
labelPwd.place(x=10, y=30, width=80, height=20)


# 创建密码文本框
varPwd = tkinter.StringVar(root, value='')
entryPwd = tkinter.Entry(root,\
                         show='*',\
                         width=80,\
                         textvariable=varPwd)
entryPwd.place(x=100, y=30, width=80, height=20)


# 尝试自动填写用户名和密码
try:
    with open(filename) as fp:
        n, p = fp.read().strip().split(',')
        varName.set(n)
        varPwd.set(p)
except:
    pass


# 登录按钮事件处理函数
def login():
    # 获取用户名和密码
    name = entryName.get()
    pwd = entryPwd.get()
    if name=='admin' and pwd=='123456':
        tkinter.messagebox.showinfo(title='恭喜',\
                                    message='登录成功!')
        # 把登录成功的信息写入临时文件       
        with open(filename, 'w') as fp:
            fp.write(','.join((name,pwd)))
    else:
        tkinter.messagebox.showerror('警告',\
                                     message='用户名或密码错误')
# 创建按钮组件,同时设置按钮事件处理函数
buttonOk = tkinter.Button(root,\
                          text='Login',\
                          command=login)
buttonOk.place(x=30, y=70, width=50, height=20)


# 取消按钮的事件处理函数
def cancel():
    #清空用户输入的用户名和密码
    varName.set('')
    varPwd.set('')
buttonCancel = tkinter.Button(root,\
                              text='Cancel',\
                              command=cancel)
buttonCancel.place(x=90, y=70, width=50, height=20)


#启动消息循环
root.mainloop()


第一次登录成功之后,再次运行结果如图所示:


----------分割线----------

重要活动通知:为答谢广大朋友的长期支持,同时为庆祝“Python小屋”开通一周年(2016年6月29日开通),“Python小屋”屋主董付国老师联合清华大学出版社于2017年6月29日开展赠书活动,关注“Python小屋”的第1、1000、2000、3000、4000、5000、6000位朋友将获得董付国老师Python系列图书一套(包含《Python程序设计基础》《Python程序设计》(第2版)(说明:第1版已不再维护,且出版社库房已无存货,无法赠送)、《Python可以这样学》《Python程序设计开发宝典》(预计2017年9月出版)以及一本神秘Python书籍(预计2017年9月出版))。为保证活动的公平性,2017年6月29日上午8点会把关注公众号的名单一次性导出,然后按照关注时间顺序公布名单并赠书。感谢清华大学出版社白立军老师的大力支持!

另:本活动长期有效,不定期举办,第7000、8000、9000、10000位以及后续整千位关注的朋友同样可以获得赠书。