Python+Tkinter简单实现注册登录功能

我们就来详细讲解一下“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技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Python构造自定义方法来美化字典结构输出的示例

    让我们开始讲解“Python构造自定义方法来美化字典结构输出的示例”完整攻略。 1. 什么是美化字典结构输出? 在Python中,字典是一种非常常用的数据类型,常常用于存储大量的键值对数据。然而,Python默认输出字典的方式可能不够清晰明了,而且对于一个包含嵌套字典的复杂结构,Python的默认输出方式会让人无法迅速掌握其结构和关系。因此,我们需要构造自定…

    python 2023年6月5日
    00
  • Python中基本的日期时间处理的学习教程

    当我们需要处理日期和时间相关的任务时,Python提供了许多内置的日期和时间模块以便于我们完成这些工作。下面是Python中基本的日期时间处理的学习教程。 1. 日期时间数据类型的介绍 Python中日期和时间都可以表示为一个对象。常用的日期时间数据类型有三种,即: date: 日期,包含年、月、日三个属性。可以通过year、month、day属性获取对应的…

    python 2023年5月14日
    00
  • Python中Collection的使用小技巧

    以下是“Python中Collection的使用小技巧”的完整攻略。 1. Collection的概述 在Python中,Collection是一种常用的数据类型,它含了多有用的数据结构,例如列表(list)、元组(tuple)、集合(set)、字典(dict)等。Collection提供了许多方便的方法和函数,可以帮助我们更高效地处理数据。本攻略将介绍Py…

    python 2023年5月13日
    00
  • Python列表去重复项的N种方法(实例代码)

    Python列表去重复项的N种方法(实例代码)攻略 在Python中,有多种方法可以去除列表中的重复项。本文将详细讲解Python列表去重复项的N种方法,包括使用set()函数、使用列表推导式、使用循环和使用字典。下面将分别介绍这些方法的具体实现。 使用set()函数 在Python中,可以使用set()函数将列表转换为集合,从而去除其中的重复项。下面是一个…

    python 2023年5月13日
    00
  • Python 怎么定义计算N的阶乘的函数

    要定义一个计算阶乘的函数,可以使用递归或循环来实现。下面是两个示例函数: 递归实现 def factorial_recursive(n): """ 计算n的阶乘(递归实现) :param n: 一个整数 :return: n的阶乘 """ # 基线情况 if n == 0 or n == 1: re…

    python 2023年6月5日
    00
  • python查询mysql中文乱码问题

    下面是详细讲解“python查询mysql中文乱码问题”的完整攻略。 问题描述 在使用 Python 查询 MySQL 数据库时,如果涉及到中文字符,有时会出现乱码问题。 原因分析 乱码问题的原因是因为 MySQL 默认使用的字符集是 Latin1,而 Python 默认使用的字符集是 utf-8。当应用程序向 MySQL 中插入中文字符时,会出现编码不一致…

    python 2023年5月20日
    00
  • Python队列Queue超详细讲解

    Python队列Queue超详细讲解 什么是队列 队列是一种先进先出(FIFO)的数据结构,其中的元素从队列的末尾(也称为“尾”)添加,从队列的开头(也称为“头”)删除。 Python中的Queue模块 Python中的Queue模块提供了一个通用的FIFO队列,Queue和LifoQueue类实现了不同的队列类型: Queue(maxsize=0):构造一…

    python 2023年6月6日
    00
  • python中的mmap稀疏向量

    【问题标题】:mmap sparse vector in pythonpython中的mmap稀疏向量 【发布时间】:2023-04-07 13:52:01 【问题描述】: 我正在寻找可以映射到内存中的简单稀疏向量实现,类似于numpy.memmap。 不幸的是,numpy 实现只处理全向量。示例用法: vec = SparseVector(‘/tmp/fi…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部