Python中tkinter的用户登录管理的实现


Posted in Python onApril 22, 2021

内容

编写一个用户登录管理程序,设计窗体的布局,制定密码规则和验证码规则。要求使用 Python 标准库 tkinter 编写基于GUI 的用户登录窗体。通过该窗体,用户输入用户名、密码和验证码等信息,确认登录后需要判断用户信息是否合法,并弹出对应的反馈信息。通过判断用户是否在用户信息中,以及输入密码是否与用户信息文件中用户名所对应的密码是否相同,来判断用户是否合法。此外,新用户还可以进行注册,注册需要输入用户名、密码、手机号和身份证号等信息。注册时密码需要遵循一定规则(长度不小于8且含有数字、字母和特殊字符),注册后将用户信息存储到文件中,更新用户信息文件。步骤

Python中tkinter的用户登录管理的实现

代码

from tkinter import *
from tkinter import messagebox
import os
import xlrd
from xlutils.copy import copy

login=Tk()
login.title('登录界面')
# 设计窗口大小
login.geometry('210x200')

# 设计GUI用户登录窗体
Label(login,text="用户登录").grid(row=0,column=0,columnspan=2)
Label(login,text="用户名").grid(row=1,column=0)
name=Entry(login)
name.grid(row=1,column=1)
Label(login,text="密码:").grid(row=2,column=0)
passWord=Entry(login,show='●')
passWord.grid(row=2,column=1)
Label(login,text="验证码:").grid(row=3,column=0,sticky=E)
verifyCode=Entry(login)
verifyCode.grid(row=3,column=1)

# 判断用户是否在用户信息.xls文件中
def isInExcel(data):
    filename = "用户信息.xls"
    excel = xlrd.open_workbook(filename, encoding_override="utf-8")
    sheet = excel.sheets()[0]

    sheet_row_mount = sheet.nrows # 行数
    sheet_col_mount = sheet.ncols # 列数

    sheet_name = []
    # 所有用户名信息
    for x in range(1, sheet_row_mount):
        y = 0
        sheet_name.append(sheet.cell_value(x, y))

    for x in sheet_name:
        # 找到用户名
        if (data == x):
            # 已有用户
            return 1
            break;
    # 未注册用户
    return -1

# 用户存在时,判断密码是否正确
def isPasswordDirect(data,passWord):
    filename = "用户信息.xls"
    excel = xlrd.open_workbook(filename, encoding_override="utf-8")
    sheet = excel.sheets()[0]

    sheet_row_mount = sheet.nrows # 行数
    sheet_col_mount = sheet.ncols # 列数

    sheet_name = []
    # 所有用户名信息
    for x in range(1, sheet_row_mount):
        y = 0
        sheet_name.append(sheet.cell_value(x, y))
    sheet_passWord=[]
    # 所有密码信息
    for x in range(1, sheet_row_mount):
        y = 1
        sheet_passWord.append(sheet.cell_value(x, y))

    for i in range(len(sheet_name)):
        if(data==sheet_name[i]):
            # 记录用户名在数组中的位置
            record=i
            break

    for i in range(len(sheet_passWord)):
        if(passWord==sheet_passWord[i]):
            # 判断用户名位置与密码位置是否相同
            # 以及密码是否与用户信息中的密码一致
            if(i==record):
                # 密码正确
                return 1
                break
    # 密码错误
    return -1

def successful():
    # 判断用户名不存在
    if (isInExcel(name.get())==-1):
        messagebox.showerror(title='wrong', message='用户不存在,请注册')
    # 密码不正确
    elif (isPasswordDirect(name.get(),passWord.get())==-1):
        messagebox.showerror(title='wrong', message='密码不正确')
    # 验证码位数不正确
    elif len(verifyCode.get())!=4:
        messagebox.showerror(title='wrong',message='验证码应为4位')
    else:
        messagebox.showinfo(title='successful',message='登录成功')
Button(login, text='发送验证码').grid(row=4, column=0, columnspan=3)
Button(login,text='登录',command=successful).grid(row=5,column=0,columnspan=3)

# 设计用户注册GUI界面
def registereds():
    registered=Tk()
    registered.title('registered')
    registered.geometry('230x185')
    Label(registered, text='用户注册').grid(row=0, column=0, columnspan=2)
    Label(registered, text='用户名:').grid(row=1, column=0, sticky=E)
    names = Entry(registered)
    names.grid(row=1, column=1)
    Label(registered, text='密码:').grid(row=2, column=0, sticky=E)
    passwds = Entry(registered, show='●')
    passwds.grid(row=2, column=1)
    Label(registered, text='确认密码:').grid(row=3, column=0)
    repasswd = Entry(registered, show='●')
    repasswd.grid(row=3, column=1)
    Label(registered, text='手机号:').grid(row=4, column=0, sticky=E)
    phonenum = Entry(registered)
    phonenum.grid(row=4, column=1)
    Label(registered, text='身份证号:').grid(row=5, column=0)
    man = Entry(registered)
    man.grid(row=5, column=1)

    # 判断是否含有特殊符号
    def teshufuhao(input_psd):
        string = "~!@#$%^&*()_+-*/<>,.[]\/"
        for i in string:
            if i in input_psd:
                return True
        return False

    def registeredes():
        # 密码长度小于8
        if len(passwds.get()) < 8:
            messagebox.showerror(title='wrong', message='注册失败,密码不应少于8位')
        # 密码不同时含有数字、字母和特殊符号
        elif not (any([x.isdigit() for x in passwds.get()]) and any([x.isalpha() for x in passwds.get()]) and teshufuhao(
                passwds.get())):
            messagebox.showerror(title='wrong', message='注册失败,密码格式错误,必须包括字母和数字以及特殊符号')
        # 两次密码输入不一样
        elif passwds.get() != repasswd.get():
            messagebox.showerror(title='wrong', message='注册失败,两次密码不相同')
        # 手机号不正确
        elif not (phonenum.get().isdigit() and len(phonenum.get()) == 11):
            messagebox.showerror(title='wrong', message='注册失败,请输入正确的11位手机号')
        # 身份证号不正确
        elif len(man.get()) != 18:
            messagebox.showerror(title='wrong', message='注册失败,请输入正确的18位身份证号')
        else:
            messagebox.showinfo(title='successful', message='注册成功!')
            # 将新用户信息存入用户信息文件
            excel = xlrd.open_workbook('用户信息.xls')
            sheet = excel.sheets()[0]

            nrow = sheet.nrows # 文件行数

            wb = copy(excel)
            w_sheet = wb.get_sheet(0)
            # 从数据下一行开始写入新用户信息
            w_sheet.write(nrow, 0, names.get())
            w_sheet.write(nrow, 1, repasswd.get())
            w_sheet.write(nrow, 2, phonenum.get())
            w_sheet.write(nrow, 3, man.get())

            wb.save('用户信息.xls')

    Button(registered, text='注册', command=registeredes).grid(row=6, column=0, columnspan=3)


Button(login, text='注册', command=registereds).grid(row=6, column=0, columnspan=3)
login.mainloop()

结果

(1)密码正确(对照用户信息文件输入密码),结果显示登录成功

Python中tkinter的用户登录管理的实现

Python中tkinter的用户登录管理的实现

(2)密码不正确,结果显示密码不正确

Python中tkinter的用户登录管理的实现

(3)密码正确,验证码位数不对

Python中tkinter的用户登录管理的实现

(4)用户名不存在

Python中tkinter的用户登录管理的实现

5. 注册新用户

(1)新用户写入用户信息文件

Python中tkinter的用户登录管理的实现

Python中tkinter的用户登录管理的实现

(2)再次登录,用户登录成功

Python中tkinter的用户登录管理的实现

到此这篇关于Python中tkinter的用户登录管理的实现的文章就介绍到这了,更多相关tkinter用户登录管理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python生成密码库功能示例
May 23 Python
python 定义给定初值或长度的list方法
Jun 23 Python
基于tensorflow加载部分层的方法
Jul 26 Python
python使用tornado实现登录和登出
Jul 28 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
python实战之用emoji表情生成文字
May 08 Python
解决Python字典查找报Keyerror的问题
May 26 Python
python爬虫之利用selenium模块自动登录CSDN
Python数据清洗工具之Numpy的基本操作
Python基础之Socket通信原理
python numpy中setdiff1d的用法说明
Apr 22 #Python
一行代码python实现文件共享服务器
Apr 22 #Python
python数据分析之用sklearn预测糖尿病
python文件名批量重命名脚本实例代码
You might like
第七节 类的静态成员 [7]
2006/10/09 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
python实现逻辑回归的方法示例
2017/05/02 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
学习决心书范文
2014/03/11 职场文书
教学质量评估实施方案
2014/03/17 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
骨干教师考核评语
2014/12/31 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL