zoukankan      html  css  js  c++  java
  • 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三层体系结构,实现用户身份验证,实验。

  • 相关阅读:
    asp.net 启动关闭iis
    vue 界面关闭触发事件 ---实例销毁之前调用
    ElmentUI 设置禁止点击遮罩关闭 el-dialog 弹窗
    C#反射
    SQL Server 创建游标(cursor)
    文件解压缩
    文件流操作
    Linq查询
    C#线程 多线程 进程
    匿名类型和反射
  • 原文地址:https://www.cnblogs.com/shitou6/p/8994366.html
Copyright © 2011-2022 走看看