我们就来详细讲解一下“Python+Tkinter 简单实现注册登录功能”的完整攻略。
概要
在这个攻略中,我们会通过 Python 和 Tkinter 库来实现一个简单的注册登录功能。其中,我们将会用到以下几个模块:
Tkinter
:用于 GUI 编程sqlite3
:用于实现用户数据的存储和查询hashlib
:用于对密码进行哈希加密
在我们的应用中,用户注册后的信息将会被保存到本地的 SQLite 数据库中,并且密码将会被加密存储。用户在登录时需要输入正确的用户名和密码才能成功登录。
接下来,我们将逐步讲解如何实现这个功能。
创建用户数据表
我们的应用需要一个本地的数据库用于存储用户数据,所以我们需要先创建一个用户数据表。在这里,我们将会使用 SQLite3 进行数据的存储和查询。
首先我们需要导入 sqlite3 模块,然后创建一个 users 表来保存用户数据。users 表包含以下几个字段:id、username 和 password。其中,id 字段是一个自增的主键,用于唯一标识每一个用户。
import sqlite3
# 连接数据库
conn = sqlite3.connect('users.db')
# 创建用户数据表
conn.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL
)
''')
# 关闭数据库连接
conn.close()
注册用户
在注册功能中,用户需要输入用户名和密码,然后将用户数据保存到数据库中。在这里,我们需要注意两个问题:密码需要进行哈希加密,防止明文密码泄露;另外,需要对用户名做唯一性校验,防止重复注册。
首先,我们需要导入 hashlib 模块,然后编写一个函数来对密码进行哈希加密。在这个函数中,我们使用 SHA-256 算法对密码进行加密。
import hashlib
def hash_password(password):
"""
对密码进行哈希加密
"""
sha256 = hashlib.sha256()
sha256.update(password.encode())
return sha256.hexdigest()
然后,我们需要编写一个函数来实现用户注册功能。在这个函数中,我们需要先查询数据库中是否已经存在相同的用户名,如果不存在,则将用户数据保存到数据库中。
def register(username, password):
"""
用户注册
"""
# 查询数据库中是否存在相同的用户名
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ?', (username,))
res = cursor.fetchone()
if res:
print('用户名已存在')
return False
else:
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 将用户数据保存到数据库中
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, hashed_password))
conn.commit()
conn.close()
print('注册成功')
return True
用户登录
当用户输入正确的用户名和密码时,应用会跳转到主界面。在这里,我们需要注意两个问题:密码需要进行哈希加密后再和数据库中的数据进行比对;如果用户名或者密码错误,应该给出提示。
首先,我们编写一个函数来验证用户登录。在该函数中,我们需要查询数据库中是否存在相同的用户名和密码。如果存在,则返回 True;否则,返回 False。
def validate_login(username, password):
"""
验证用户登录
"""
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 查询数据库中是否存在相同的用户名和密码
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, hashed_password))
res = cursor.fetchone()
if res:
return True
else:
return False
然后,我们需要编写一个函数来实现用户登录功能。在这个函数中,我们需要获取用户输入的用户名和密码,然后调用 validate_login 函数来校验用户名和密码是否正确。
def login():
"""
用户登录
"""
# 获取用户输入的用户名和密码
username = username_entry.get()
password = password_entry.get()
# 校验用户名和密码是否正确
if validate_login(username, password):
print('登录成功')
# 跳转到主界面
to_main()
else:
print('用户名或密码错误')
示例1:
注册
我们可以通过如下代码实现注册功能。
from tkinter import *
import sqlite3
import hashlib
def hash_password(password):
"""
对密码进行哈希加密
"""
sha256 = hashlib.sha256()
sha256.update(password.encode())
return sha256.hexdigest()
def register(username, password):
"""
用户注册
"""
# 查询数据库中是否存在相同的用户名
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ?', (username,))
res = cursor.fetchone()
if res:
print('用户名已存在')
return False
else:
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 将用户数据保存到数据库中
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, hashed_password))
conn.commit()
conn.close()
print('注册成功')
return True
# 创建窗口
root = Tk()
root.geometry('300x200')
root.title('注册')
# 创建用户名标签和用户名框
username_label = Label(root, text='用户名:')
username_label.place(x=30, y=30)
username_entry = Entry(root, width=20)
username_entry.place(x=100, y=30)
# 创建密码标签和密码框
password_label = Label(root, text='密码:')
password_label.place(x=30, y=70)
password_entry = Entry(root, width=20, show='*')
password_entry.place(x=100, y=70)
# 创建注册按钮
register_button = Button(root, text='注册', command=lambda: register(username_entry.get(), password_entry.get()))
register_button.place(x=130, y=120)
root.mainloop()
运行代码后,我们会看到一个简单的注册界面。输入用户名和密码,然后点击注册按钮即可。
登录
我们可以通过如下代码实现登录功能。
from tkinter import *
import sqlite3
import hashlib
def hash_password(password):
"""
对密码进行哈希加密
"""
sha256 = hashlib.sha256()
sha256.update(password.encode())
return sha256.hexdigest()
def validate_login(username, password):
"""
验证用户登录
"""
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 查询数据库中是否存在相同的用户名和密码
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, hashed_password))
res = cursor.fetchone()
if res:
return True
else:
return False
# 创建窗口
root = Tk()
root.geometry('300x200')
root.title('登录')
# 创建用户名标签和用户名框
username_label = Label(root, text='用户名:')
username_label.place(x=30, y=30)
username_entry = Entry(root, width=20)
username_entry.place(x=100, y=30)
# 创建密码标签和密码框
password_label = Label(root, text='密码:')
password_label.place(x=30, y=70)
password_entry = Entry(root, width=20, show='*')
password_entry.place(x=100, y=70)
# 创建登录按钮
login_button = Button(root, text='登录', command=lambda: login())
login_button.place(x=130, y=120)
def login():
"""
用户登录
"""
# 获取用户输入的用户名和密码
username = username_entry.get()
password = password_entry.get()
# 校验用户名和密码是否正确
if validate_login(username, password):
print('登录成功')
# 跳转到主界面
to_main()
else:
print('用户名或密码错误')
def to_main():
"""
跳转到主界面
"""
root.destroy()
# 主循环
root.mainloop()
运行代码后,我们会看到一个简单的登录界面。输入正确的用户名和密码,然后点击登录按钮即可。
示例2
注册
我们可以使用带图标和背景的注册界面使得页面看起来更加美观。
from tkinter import *
import sqlite3
import hashlib
def hash_password(password):
"""
对密码进行哈希加密
"""
sha256 = hashlib.sha256()
sha256.update(password.encode())
return sha256.hexdigest()
def register(username, password):
"""
用户注册
"""
# 查询数据库中是否存在相同的用户名
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ?', (username,))
res = cursor.fetchone()
if res:
print('用户名已存在')
return False
else:
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 将用户数据保存到数据库中
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, hashed_password))
conn.commit()
conn.close()
print('注册成功')
return True
# 创建窗口
root = Tk()
root.geometry('300x200')
root.title('注册')
# 设置窗口图标
root.iconbitmap('icon.ico')
# 设置窗口背景
background_image = PhotoImage(file='bg.png')
background_label = Label(root, image=background_image)
background_label.place(x=0, y=0, relwidth=1, relheight=1)
# 创建用户名标签和用户名框
username_label = Label(root, text='用户名:', font=('微软雅黑', 12), bg='white')
username_label.place(x=30, y=30)
username_entry = Entry(root, width=20, font=('微软雅黑', 12))
username_entry.place(x=100, y=30)
# 创建密码标签和密码框
password_label = Label(root, text='密码:', font=('微软雅黑', 12), bg='white')
password_label.place(x=30, y=70)
password_entry = Entry(root, width=20, show='*', font=('微软雅黑', 12))
password_entry.place(x=100, y=70)
# 创建注册按钮
register_button = Button(root, text='注册', command=lambda: register(username_entry.get(), password_entry.get()), bg='white', font=('微软雅黑', 12))
register_button.place(x=130, y=120)
root.mainloop()
运行代码后,我们会看到一个带图标和背景的注册界面。输入正确的用户名和密码,然后点击注册按钮即可。
登录
我们可以使用带图标和背景的登录界面使得页面看起来更加美观。
from tkinter import *
import sqlite3
import hashlib
def hash_password(password):
"""
对密码进行哈希加密
"""
sha256 = hashlib.sha256()
sha256.update(password.encode())
return sha256.hexdigest()
def validate_login(username, password):
"""
验证用户登录
"""
# 对密码进行哈希加密
hashed_password = hash_password(password)
# 查询数据库中是否存在相同的用户名和密码
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, hashed_password))
res = cursor.fetchone()
if res:
return True
else:
return False
# 创建窗口
root = Tk()
root.geometry('300x200')
root.title('登录')
# 设置窗口图标
root.iconbitmap('icon.ico')
# 设置窗口背景
background_image = PhotoImage(file='bg.png')
background_label = Label(root, image=background_image)
background_label.place(x=0, y=0, relwidth=1, relheight=1)
# 创建用户名标签和用户名框
username_label = Label(root, text='用户名:', font=('微软雅黑', 12), bg='white')
username_label.place(x=30, y=30)
username_entry = Entry(root, width=20, font=('微软雅黑', 12))
username_entry.place(x=100, y=30)
# 创建密码标签和密码框
password_label = Label(root, text='密码:', font=('微软雅黑', 12), bg='white')
password_label.place(x=30, y=70)
password_entry = Entry(root, width=20, show='*', font=('微软雅黑', 12))
password_entry.place(x=100, y=70)
# 创建登录按钮
login_button = Button(root, text='登录', command=lambda: login(), bg='white', font=('微软雅黑', 12))
login_button.place(x=130, y=120)
def login():
"""
用户登录
"""
# 获取用户输入的用户名和密码
username = username_entry.get()
password = password_entry.get()
# 校验用户名和密码是否正确
if validate_login(username, password):
print('登录成功')
# 跳转到主界面
to_main()
else:
print('用户名或密码错误')
def to_main():
"""
跳转到主界面
"""
root.destroy()
root.mainloop()
运行代码后,我们会看到一个带图标和背景的登录界面。输入正确的用户名和密码,然后点击登录按钮即可。
以上就是本次“Python+Tkinter 简单实现注册登录功能”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+Tkinter简单实现注册登录功能 - Python技术站