Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证

Python tkinter 实现简单登陆注册

最终效果

  1. 开始界面

  2. 注册

  3. 登陆


源码

login.py

# encoding=utf-8
from tkinter import *
from tkinter import messagebox as tkMessageBox
import mysql_connect as mys
import pymysql
import base64

#加密 将用户的密码加密后储存到数据库
def encryption(str):
    str=str.encode(encoding="utf-8")
    s2=base64.b64encode(str)
    return s2.decode()

#解密 将数据库返回的密文解密后验证用户密码
def decryption(str):
    str = str.encode(encoding="utf-8")
    s1=base64.b64decode(str)
    return s1.decode()

#处理注册
def newuser(name,pwd):
    #声明全局变量,传递给insert
    global cursor,db
    pwd=encryption(pwd)   #加密
    if mys.name_exist(cursor,name): #返回正确的值说明用户名存在
            tkMessageBox.showinfo(title='失败', message='用户名已存在!')
            return False
    else:
        mys.insert_data(db=db,cursor=cursor,name=name,password=pwd)
        tkMessageBox.showinfo(title='成功', message='注册成功')

#处理直接登录
def olduser(name,pwd):
    global cursor
    # print(name,pwd)
    password=mys.get_password(cursor,name)
    password=decryption(password) #解密
    print("password : ",password)
    print(pwd)
    if password == pwd:
        tkMessageBox.showinfo(title='成功', message='登陆成功! welcome back '+name)
    else:
        tkMessageBox.showinfo(title='失败', message='登录失败')

#处理注册窗口
def signin():
    win1 = Toplevel()
    l1 = Label(win1, text="注册")
    l1.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    l2 = Label(win1, text="姓名:")
    l2.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    sheet_text1 = StringVar()
    sheet1 = Entry(win1, textvariable=sheet_text1)
    sheet1.pack()

    l3 = Label(win1, text="密码:")
    l3.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    sheet_text2 = StringVar()
    sheet2 = Entry(win1, textvariable=sheet_text2)
    sheet2.pack()

    def on_click1():
        name = sheet_text1.get()
        pwd = sheet_text2.get()
        #调用处理新用户窗口
        newuser(str(name),str(pwd))

    Button(win1, text="press", command=on_click1).pack()

#处理登录窗口
def login():
    # win1 = Tk.winfo_toplevel(root)
    #焦点绑定到当前窗口,否则无法获取输入
    win1 = Toplevel()
    l4 = Label(win1, text="登录")
    l4.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    l5 = Label(win1, text="姓名:")
    l5.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    sheet_text3 = StringVar()
    sheet3 = Entry(win1, textvariable=sheet_text3)
    sheet3.pack()

    l6 = Label(win1, text="密码:")
    l6.pack()  # 这里的side可以赋值为LEFT  RTGHT TOP  BOTTOM
    sheet_text4 = StringVar()
    sheet4 = Entry(win1, textvariable=sheet_text4)
    sheet4.pack()

    def on_click2():
        name = sheet_text3.get()
        pwd = sheet_text4.get()
        olduser(name,pwd)

    Button(win1, text="press", command=on_click2).pack()

#退出程序
def quit1():
    root.quit()


if __name__ == '__main__':

    try:
        db = pymysql.connect("39.106.152.189", "study", "stfk0615", "study", use_unicode=True, charset='utf8')
        cursor = db.cursor()
    except:
        print("connect error!")

    root = Tk()
    root.title('用户登录窗口')

    #分别进入不同的窗口
    Button(root, text="注册", command=signin).pack()
    Button(root, text="登录", command=login).pack()
    Button(root, text="退出", command=quit1).pack()

    root.mainloop()

mysql_connect.py //封装MySQL操作

import pymysql
# import traceback
def name_exist(cursor,name):
    exist_sql="""
    SELECT PASSWORD
    FROM INFO
    WHERE NAME='%s' ;"""%(str(name)) #字符串匹配替换 name
    cursor.execute(exist_sql)
    result=cursor.fetchall()
    if result:
        return True #表示存在、
    else:return False #表示不存在
def insert_data(db,cursor,name,password):
    #插入数据
    insert_sql="""
    INSERT INTO INFO(NAME,PASSWORD) VALUES('%s','%s');"""%(str(name),str(password))
    try:
        cursor.execute(insert_sql) #执行sql
        db.commit()
        return True
    except Exception:
        print(Exception.args)
        print('insert error')
        return False

def creat_table(cursor,name):
   # 创建数据表
    sql="""
        CREATE TABLE %s(
        NAME CHAR(20) NOT NULL,
        PASSWORD CHAR(20));
    """%(str(name))

    try:
        cursor.execute(sql)
        return True
    except:
        print("creat_table error")
        return False

def get_password(cursor,name):
    #得到name对应的密码
    sql="""
    SELECT PASSWORD
    FROM INFO
    WHERE NAME='%s' ;"""%(str(name)) #字符串匹配替换 name
    try:
        cursor.execute(sql)
        result=cursor.fetchall() #得到所有的结果
        for a in result:  #遍历结果 实际上返回的应该就只要一个值
            print(a[0])
            return a[0]
    except:
        print("get_error")
        return False

def connect():
    try:
        db = pymysql.connect("39.106.152.189", "study", "stfk0615","study"
                             ,use_unicode=True,charset='utf8')
        #db.set_charset('utf-8')
        cursor = db.cursor()
        # cursor.execute('SET NAMES utf8;')
        # cursor.execute('SET CHARACTER SET utf8;')
        # cursor.execute('SET character_set_connection=utf8;')
        return cursor
    except:
        print("connect error!")
        return False
if __name__=='__main__':
    db=pymysql.connect("39.106.152.189","study","stfk0615","study")
    cursor=db.cursor()

    db.close()

转发请注明出处,谢谢。

本源码用于 基于B/S三层体系结构,实现用户身份验证,实验。

原文地址:https://www.cnblogs.com/shitou6/p/8994366.html