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

yizhihongxing

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

相关文章

  • mysql 通过拷贝数据文件的方式进行数据库迁移实例

    当需要将MySQL数据库从一个服务器迁移到另一个服务器时,通常有几种方法可以完成此操作。其中一种方法是通过拷贝数据文件的方式进行数据库迁移,也称为物理备份。 步骤一:关闭MySQL服务器 为了确保数据在迁移过程中不会被更改或丢失,需要首先关闭MySQL服务器。在Linux系统上,可以使用以下命令关闭MySQL服务器: service mysql stop 步…

    python 2023年6月6日
    00
  • 小白学Python之实现OCR识别

    小白学Python之实现OCR识别攻略 简介 OCR(Optical Character Recognition)是一种将图片或扫描文档中的文本转换成可编辑和搜索的文本的技术。Python作为一种强大的编程语言,有许多 OCR 库和工具可以用于实现 OCR 功能。在本文中,我们将通过几个简单的步骤,介绍如何使用Python实现OCR识别。 步骤 步骤1:安装…

    python 2023年5月18日
    00
  • 解决Python pandas plot输出图形中显示中文乱码问题

    下面是解决Python pandas plot输出图形中显示中文乱码问题的完整攻略: 1. 确认matplotlib默认字体 Matplotlib是Python中最常用的绘图库之一,而在Matplotlib中绘制图形时,中文乱码的问题比较常见,因为默认情况下Matplotlib并没有指定中文字体。因此,我们需要先确认一下Matplotlib默认使用哪个字体。…

    python 2023年5月20日
    00
  • python中的list 查找与过滤方法整合

    以下是“Python中的List查找与过滤方法整合”的完整攻略。 Python中的List查找与过滤方法整合 在Python中,List是一种常见的数据类型,可以存储多个值。在实际开发中,我们经常需要查找或过滤List中的元素。本文将介绍Python中的List查找与过滤方法,并提供一些示例。 查找元素 可以使用in关键字或index()方法来查找List中…

    python 2023年5月13日
    00
  • Python实现将SQLite中的数据直接输出为CVS的方法示例

    下面是Python实现将SQLite中的数据直接输出为CVS的方法示例的完整攻略。 1. 准备工作 首先需要在机器上安装Python和SQLite。 安装Python:可以在官网下载安装包或使用包管理工具进行安装。 安装SQLite:在Linux和macOS系统下,可以使用系统自带的SQLite,也可以使用包管理工具安装;在Windows系统下,可在SQLi…

    python 2023年6月3日
    00
  • 解决pytorch 的state_dict()拷贝问题

    PyTorch的state_dict()提供了一个方便的方式来保存训练模型的参数,同时也允许在不同的模型之间的参数拷贝。但是,当涉及到GPU-CPU或者多GPU操作时,拷贝state_dict()会遇到一些问题。以下是解决PyTorch的state_dict()拷贝问题的完整攻略: 问题概述 在GPU/CPU之间拷贝state_dict()的过程中,会有一些…

    python 2023年5月13日
    00
  • Python网络爬虫之HTTP原理

    Python网络爬虫之HTTP原理 本攻略主要介绍Python网络爬虫中的HTTP原理,包括URL、请求方式、请求头、响应状态码、响应体等内容,帮助读者了解HTTP协议,进而编写出高效、健壮的网络爬虫程序。 HTTP协议 HTTP(Hypertext Transfer Protocol,超文本传输协议)是Web应用程序的基础。它是一种基于请求与响应模式的、无…

    python 2023年6月3日
    00
  • 基于Pandas读取csv文件Error的总结

    针对“基于Pandas读取csv文件Error”的总结,我会按照以下内容进行详细讲解: 背景介绍 基于Pandas读取csv文件的错误总结 示例说明1 示例说明2 总结 接下来,我将按照这个结构逐一进行介绍和解释。 1. 背景介绍 Pandas是一个流行的Python数据分析库。通过Pandas,我们可以载入各种数据集,并且完成数据分析和处理。其中,读取CS…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部