Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证
Python tkinter 实现简单登陆注册
最终效果
开始界面

注册
登陆

源码
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三层体系结构,实现用户身份验证,实验。
Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证的更多相关文章
- 利用python实现简单登陆注册系统
#!/usr/bin/env python # -*- coding:utf-8 -*- def login(username,password): ''' :param username:用户名 : ...
- [小菜随笔]python tkinter实现简单的ping命令
本文主要是介绍python图形界面上的按键与实际功能的对接,其实编程掌握了基础之后的学习应该都是靠自己去挖掘其他的 在网上发现多半教程都是2的,故本文使用的是python3.5,其实也没什么区别,就有 ...
- html+css+js实现简单登陆注册页面
先看一下最终效果,登陆和注册 背景图片: 附源码: login.html <!DOCTYPE html> <html lang="en"> <head ...
- 三层架构(MVC)实现简单登陆注册验证(含验证码)
前言在我的上一篇微博里我已经提出了登陆的方法,当时我采取的是纯servlet方式,因为当时刚接触到servlet,正好网上没有这方面的全面讲解,所以我就发飙了.不过在现实生产中我们大多采用的三层架构. ...
- Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
1.首先了解一下Token 1.token也称作令牌,由uid+time+sign[+固定参数]组成: uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/e ...
- 从零开始的SpringBoot项目 ( 八 ) 实现基于Token的用户身份验证
1.首先了解一下Token uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接 固定参数(可 ...
- IdentityServer4【Topic】之登陆注册
Sign-in 登陆注册 为了让标识服务器(identity server)代表用户发出令牌,该用户必须登录到标识服务器. Cookie authentication Cookie认证 身份验证是由来 ...
- python练习_简单登录
python练习_简单登录 需求: 做一个登录的小程序,验证用户与密码 要求登录三次错误后锁定 以下代码实现的功能与思路: 功能: 1.除admin以外的用户累计登录失败次数超过三次则锁定,此时需要管 ...
- 1.关于狗书《Flask Web开发 基于Python的web开发应用实战》身份验证的改进
在我学习用户身份验证的时候,我发现这里有个小弊端,在用户注册完成后想要验证邮箱的时候,点击邮箱中的网址进行验证,此时还要登陆,这及其不符合我们的习惯.一般情况下我们只需要点击网址就可以验证成功并且进入 ...
随机推荐
- [转帖]Hadoop与Spark比较
Hadoop与Spark比较 https://www.cnblogs.com/charlesblc/p/6206198.html 感觉自己落下好多东西没有学习 先看这篇文章:http://www.hu ...
- python 之 数据库(视图、触发器、事务、存储过程)
10.13 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 视图记录的增.删 ...
- 07 UML类图
移步: https://www.cnblogs.com/coolstream/p/9572846.html
- 多进程实现并发服务器(TCP)
前提:基于Linux系统的学习 /*多进程实现并发服务器 父进程任务 1.从未决连接队列中取出请求,建立和客户端的连接,cfd 2.创建子进程 3.close(cfd) 4.负责子进程的收尸工作 子进 ...
- Qt4 和 Qt5 模块的分类
Qt5 与 Qt4 其中的一个区别是底层架构进行了改变,Qt5 引入了更加详细的模块化的概念,将众多功能细分到几个模块之中,Qt4 则是一种粗略的划分.本文主要对 Qt5 和 Qt4的模块进行一个简单 ...
- js复制内容到粘贴板
点击右边内容:<span onclick="copyContent(this);" title="点击复制">啊,我被复制了</span> ...
- Markdown试试
from os import time print("haha") from os import time print("haha") time.time()! ...
- 腾讯域名使用百度CDN加速配置
1.百度CDN资源包购买 购买地址 https://console.bce.baidu.com/cdn/#/cdn/package/create 我比较穷所以买的是18块100G的资源包. 2.添加域 ...
- ASP.NET Core中防跨站点请求伪造
CSRF(Cross-site request forgery)利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的. 例子 在某个 ...
- Go part 7 反射,反射类型对象,反射值对象
反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...


