当前位置: 首页 > news >正文

用Python和Tkinter标准模块建立密码管理器

用Python和Tkinter标准模块建立密码管理器

创建一个简单的密码管理器应用程序,帮助用户存储和管理他们的密码。使用Python的tkinter模块来创建一个图形用户界面(GUI)。

本程序支持 添加、查看、搜索、复制、修改、删除 功能。

本程序使用 SQLite建立 passwords.db用以保存密码信息。

通过强制所有密码相关操作以字符串形式处理,解决前导零丢失问题。

Base64是Python的标准库模块之一,用于进行Base64编码和解码操作。Base64并不是一种加密算法,而是一种编码方案,它不适合用于保护敏感信息,在此用于简化演示。如果需要保护敏感信息(如密码),应使用真正的加密算法(如 AES)。

运行效果:

源码如下:

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import base64# 加密函数(强制输入为字符串)
def encrypt(password):password_str = str(password)  # 强制转为字符串return base64.b64encode(password_str.encode()).decode()# 解密函数(直接返回字符串)
def decrypt(encrypted_password):decrypted_bytes = base64.b64decode(encrypted_password.encode())return decrypted_bytes.decode()  # 直接返回字符串# 初始化数据库
def init_db():conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("""CREATE TABLE IF NOT EXISTS passwords (id INTEGER PRIMARY KEY AUTOINCREMENT,project TEXT NOT NULL,username TEXT NOT NULL,password TEXT NOT NULL)""")conn.commit()conn.close()# 添加密码(强制密码为字符串)
def add_password():project = project_entry.get()username = username_entry.get()password = password_entry.get()if not project or not username or not password:messagebox.showwarning("输入错误", "请填写所有字段!")returnencrypted_password = encrypt(str(password))  # 强制转为字符串conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("INSERT INTO passwords (project, username, password) VALUES (?, ?, ?)",(project, username, encrypted_password))conn.commit()conn.close()project_entry.delete(0, tk.END)username_entry.delete(0, tk.END)password_entry.delete(0, tk.END)view_passwords()# 查看密码(显示时强制转为字符串)
def view_passwords():for row in tree.get_children():tree.delete(row)conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("SELECT id, project, username, password FROM passwords")rows = cursor.fetchall()conn.close()for row in rows:id, project, username, encrypted_password = rowdecrypted_password = decrypt(encrypted_password)tree.insert("", tk.END, values=(id, project, username, str(decrypted_password)))# 搜索密码
def search_password():search_term = search_entry.get()for row in tree.get_children():tree.delete(row)conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("SELECT id, project, username, password FROM passwords WHERE project LIKE ?",(f"%{search_term}%",))rows = cursor.fetchall()conn.close()for row in rows:id, project, username, encrypted_password = rowdecrypted_password = decrypt(encrypted_password)tree.insert("", tk.END, values=(id, project, username, str(decrypted_password)))# 复制密码(关键修复:直接从数据库获取)
def copy_password():selected_item = tree.selection()if not selected_item:messagebox.showwarning("未选择", "请选择一条记录!")return# 获取选中行的项目名和用户名item = tree.item(selected_item)project = item["values"][1]username = item["values"][2]# 直接从数据库查询原始密码conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("SELECT password FROM passwords WHERE project = ? AND username = ?", (project, username))row = cursor.fetchone()conn.close()if row:encrypted_password = row[0]decrypted_password = decrypt(encrypted_password)root.clipboard_clear()root.clipboard_append(str(decrypted_password))  # 强制转为字符串messagebox.showinfo("复制成功", "密码已复制到剪贴板!")else:messagebox.showerror("错误", "未找到密码!")# 删除记录
def delete_password():selected_item = tree.selection()if not selected_item:messagebox.showwarning("未选择", "请选择一条记录!")returnitem = tree.item(selected_item)record_id = item["values"][0]confirm = messagebox.askyesno("确认删除", "确定要删除这条记录吗?")if not confirm:returnconn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("DELETE FROM passwords WHERE id = ?", (record_id,))conn.commit()conn.close()view_passwords()# 修改记录(关键修复:输入框获取值强制为字符串)
def edit_password():selected_item = tree.selection()if not selected_item:messagebox.showwarning("未选择", "请选择一条记录!")returnitem = tree.item(selected_item)record_id = item["values"][0]# 直接从数据库获取原始密码conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("SELECT project, username, password FROM passwords WHERE id = ?", (record_id,))project, username, encrypted_password = cursor.fetchone()conn.close()current_password = decrypt(encrypted_password)edit_window = tk.Toplevel(root)edit_window.title("修改记录")edit_window.geometry("300x200")# 项目名ttk.Label(edit_window, text="项目名:").grid(row=0, column=0, padx=5, pady=5)project_entry = ttk.Entry(edit_window, width=25)project_entry.grid(row=0, column=1, padx=5, pady=5)project_entry.insert(0, project)# 用户名ttk.Label(edit_window, text="用户名:").grid(row=1, column=0, padx=5, pady=5)username_entry = ttk.Entry(edit_window, width=25)username_entry.grid(row=1, column=1, padx=5, pady=5)username_entry.insert(0, username)# 密码(关键:输入框直接使用字符串,避免转换)ttk.Label(edit_window, text="密码:").grid(row=2, column=0, padx=5, pady=5)password_entry = ttk.Entry(edit_window, width=25)password_entry.grid(row=2, column=1, padx=5, pady=5)password_entry.insert(0, str(current_password))  # 强制转为字符串def save_edit():new_project = project_entry.get()new_username = username_entry.get()new_password = password_entry.get()  # 直接获取字符串if not new_project or not new_username or not new_password:messagebox.showwarning("输入错误", "请填写所有字段!")returnencrypted_password = encrypt(str(new_password))  # 加密前确保为字符串conn = sqlite3.connect("passwords.db")cursor = conn.cursor()cursor.execute("""UPDATE passwords SET project = ?, username = ?, password = ?WHERE id = ?""", (new_project, new_username, encrypted_password, record_id))conn.commit()conn.close()messagebox.showinfo("成功", "记录已更新!")edit_window.destroy()view_passwords()save_button = ttk.Button(edit_window, text="保存", command=save_edit)save_button.grid(row=3, column=0, columnspan=2, pady=10)# 初始化数据库
init_db()# 创建主窗口
root = tk.Tk()
root.title("密码管理器")
root.geometry("800x600")# 输入区域
input_frame = ttk.LabelFrame(root, text="添加密码")
input_frame.pack(fill=tk.X, padx=10, pady=10)ttk.Label(input_frame, text="项目名:").grid(row=0, column=0, padx=5, pady=5)
project_entry = ttk.Entry(input_frame, width=30)
project_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(input_frame, text="用户名:").grid(row=1, column=0, padx=5, pady=5)
username_entry = ttk.Entry(input_frame, width=30)
username_entry.grid(row=1, column=1, padx=5, pady=5)ttk.Label(input_frame, text="密码:").grid(row=2, column=0, padx=5, pady=5)
password_entry = ttk.Entry(input_frame, width=30)
password_entry.grid(row=2, column=1, padx=5, pady=5)add_button = ttk.Button(input_frame, text="添加", command=add_password)
add_button.grid(row=3, column=0, columnspan=2, pady=10)# 搜索区域
search_frame = ttk.LabelFrame(root, text="搜索密码")
search_frame.pack(fill=tk.X, padx=10, pady=10)ttk.Label(search_frame, text="搜索项目名:").grid(row=0, column=0, padx=5, pady=5)
search_entry = ttk.Entry(search_frame, width=30)
search_entry.grid(row=0, column=1, padx=5, pady=5)search_button = ttk.Button(search_frame, text="搜索", command=search_password)
search_button.grid(row=0, column=2, padx=5, pady=5)show_all_button = ttk.Button(search_frame, text="全部显示", command=view_passwords)
show_all_button.grid(row=0, column=3, padx=5, pady=5)# 密码列表
tree_frame = ttk.LabelFrame(root, text="密码列表")
tree_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)columns = ("id", "project", "username", "password")
tree = ttk.Treeview(tree_frame, columns=columns, show="headings")
tree.heading("project", text="项目名")
tree.heading("username", text="用户名")
tree.heading("password", text="密码")
tree.column("id", width=0, stretch=tk.NO)  # 隐藏ID列
tree.column("password", width=150)
tree.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)# 操作按钮区域
button_frame = ttk.Frame(tree_frame)
button_frame.pack(pady=10)copy_button = ttk.Button(button_frame, text="复制密码", command=copy_password)
copy_button.pack(side=tk.LEFT, padx=5)edit_button = ttk.Button(button_frame, text="修改记录", command=edit_password)
edit_button.pack(side=tk.LEFT, padx=5)delete_button = ttk.Button(button_frame, text="删除记录", command=delete_password)
delete_button.pack(side=tk.LEFT, padx=5)# 首次加载显示数据
view_passwords()# 运行主循环
root.mainloop()

相关文章:

用Python和Tkinter标准模块建立密码管理器

用Python和Tkinter标准模块建立密码管理器 创建一个简单的密码管理器应用程序,帮助用户存储和管理他们的密码。使用Python的tkinter模块来创建一个图形用户界面(GUI)。 本程序支持 添加、查看、搜索、复制、修改、删除 功能。 本程序使用 …...

PyQt5菜单加多页签实现

pyqt tabs标签_哔哩哔哩_bilibili 代码实现 # coding:utf-8 import sys from PyQt5.QtCore import Qt from PyQt5 import QtCore,QtWidgets from PyQt5.QtWidgets import QApplication,QWidget from QhTabs01 import Ui_Form from PyQt5.Qt import *class QhLiangHuaGUI(QWidg…...

关注搜索引擎蜘蛛压力

以前在建站的时候,他们说蜘蛛来抓取的频率越多越好,因为蜘蛛来抓取说明了网站更新速度快,受搜索引擎的欢迎,但是在最近的网站统计中,发现很多蜘蛛爬取的频次非常的高,比如有的蜘蛛一天能来网站几万次&#…...

Python3 OS模块中的文件/目录方法说明三

一. 简介 前面文章简单学习了Python3中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS模块中文件、目录的操作方法:os.fdopen()方法、os.fpathconf() 方法、os.fstat() 方法、os.fstatvfs() 方法。 二. Python3 OS模块中的文件/目录方法说明三 1. os.fdop…...

2024年终总结:技术成长与突破之路

文章目录 前言一、技术成长:菜鸟成长之路1. 学习与实践的结合2. 技术分享与社区交流 二、生活与事业的平衡:技术之外的思考1. 时间管理与效率提升2. 技术对生活的积极影响 三、突破与展望:未来之路1. 技术领域的突破2. 未来规划与目标 四、结…...

mysql-06.JDBC

目录 什么是JDBC: 为啥存在JDBC: JDBC工作原理: JDBC的优势: 下载mysql驱动包: 用java程序操作数据库 1.创建dataSource: 2.与服务端建立连接 3.构造sql语句 4.执行sql 5.关闭连接,释放资源 参考代码: 插…...

使用python调用JIRA6 进行OAuth1认证获取AccessToken

Jira配置应用程序链接 1) 创建应用程序链接 登录 JIRA 管理后台。转到 Administration > Applications > Application Links。在输入框中输入外部应用程序的 URL(例如 GitLab 或自定义应用),然后点击 Create new link。 2) 配置 Con…...

HTML5使用favicon.ico图标

目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志,它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站,这里以https://www.bitbug.net/为例。上传图片,目标尺寸选择48x48&a…...

黑龙江锅包肉:酸甜香酥的东北经典

黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…...

Unity阿里云OpenAPI 获取 Token的C#【记录】

获取Token using UnityEngine; using System; using System.Text; using System.Linq; using Newtonsoft.Json.Linq; using System.Security.Cryptography; using UnityEngine.Networking; using System.Collections.Generic; using System.Globalization; using Cysharp.Thr…...

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件

最近研究不安装office也可以保存Excel文件,在网上查询资料找到这个方法。 第一步:下载EPPlus.dll文件(自行去网上搜索下载) 第二步:引用到需要用的项目中,如图所示: 第三步:写代码…...

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...

C语言#define TSLP0 (TSLP_Regdef *)TSENSORO BASE ADDR)的含义?

在C语言中,#define指令用于定义宏。宏是一种预处理器指令,它允许你为代码片段指定一个名称,以便在编译时进行替换。 从你的描述来看,似乎你想定义一个名为 TSLP0 的宏,其值是某个寄存器地址。假设 TSENSORO_BASE_ADDR…...

微信小程序wxs实现UTC转北京时间

微信小程序实现UTC转北京时间 打脸一刻:最近在迭代原生微信小程序,好一段时间没写原生的,有点不习惯; 咦,更新数据咋不生效呢?原来还停留在 this.xxx; 哟,事件又没反应了&#xff1f…...

提示词的艺术 ---- AI Prompt 进阶(提示词框架)

提示词的艺术 ---- AI Prompt 进阶(提示词框架) 写在前面 上周发布了一篇《提示词的艺术----AI Prompt撰写指南》,旨在帮助读者理解提示词的作用,以及简单的提示词撰写指南。本篇作为进阶内容,将给出常用的提示词框架…...

WPF常见面试题解答

以下是WPF(Windows Presentation Foundation)面试中常见的问题及解答,涵盖基础概念、高级功能和实际应用,帮助你更好地准备面试: 基础概念 什么是WPF? WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...

TypeScript 学习

TypeScript 类型 准备本地环境 初始化 TypeScript 项目, 生成 package.json 文件: npm init -y安装 typescript: yarn add typescript -D初始化 TypeScript 配置文件: npx tsc--init输出: Created a new tsconfig.json with:target: es2016module: commonjsstrict: true…...

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…...

C++/CLI(Common Language Runtime)关键点详解

C++/CLI(Common Language Runtime)是 Microsoft Visual C++ 的一个扩展,允许使用 .NET Framework 的功能,同时保留对本机 C++ 代码的访问。当您需要在 C++ 和 C# 之间进行互操作时,C++/CLI 是一种常见的选择,因为它可以作为桥梁,将托管代码(如 C#)与非托管代码(如 C+…...

Transfoemr的解码器(Decoder)与分词技术

在自然语言处理(NLP)领域,解码器(Decoder)和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件,而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器(Decoder&…...

终极指南:Lottie动画版本管理的5个专业技巧

终极指南:Lottie动画版本管理的5个专业技巧 【免费下载链接】lottie Lottie documentation for http://airbnb.io/lottie. 项目地址: https://gitcode.com/gh_mirrors/lo/lottie Lottie是Airbnb开发的开源动画库,它能让开发者轻松地在移动应用和网…...

避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了

避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了 在制造业数字化转型的浪潮中,SAP PP模块作为生产计划的核心枢纽,常常成为企业运营的"隐形战场"。许多实施顾问和计划专员在MD41和MD02这两个相似的事务码前陷…...

RobotStudio机器人轨迹规划:从工件坐标到流畅路径的实战指南

1. 工件坐标系的创建与校准 在RobotStudio中规划机器人轨迹的第一步,就是建立准确的工件坐标系。这就像盖房子前要先打好地基,坐标系就是机器人运动的"地基"。我见过不少新手直接开始示教点位,结果发现机器人总是跑偏,就…...

Kandinsky-5.0-I2V-Lite-5s企业应用:HR招聘海报→候选人互动式动态介绍视频生成

Kandinsky-5.0-I2V-Lite-5s企业应用:HR招聘海报→候选人互动式动态介绍视频生成 1. 引言:让招聘海报"活"起来 想象一下这样的场景:你的HR团队精心设计了一份招聘海报,但投递量却不如预期。问题可能出在传统静态海报难…...

QKeyMapper:Windows终极按键映射工具,无需重启立即生效

QKeyMapper:Windows终极按键映射工具,无需重启立即生效 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止,新增虚拟游戏…...

如何评估 SEO 优化的成本效益_SEO优化应该重点关注哪些方面

如何评估 SEO 优化的成本效益 在当今互联网时代,搜索引擎优化(SEO)已经成为了提升网站流量和品牌知名度的关键手段。SEO 优化的成本效益评估并不是一件简单的事情。如何在有限的预算内实现最大的效益,是每一个企业和网站运营者都需…...

实测Qwen3-4B:256K超长上下文,处理长文档、写长文真实案例

实测Qwen3-4B:256K超长上下文,处理长文档、写长文真实案例 1. 引言:为什么关注长上下文能力 在日常工作和创作中,我们经常遇到需要处理超长文档的场景:分析上百页的PDF报告、阅读整本电子书、编写长篇技术文档等。传…...

音乐自由之路:Unlock-Music技术突破实战指南

音乐自由之路:Unlock-Music技术突破实战指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcod…...

等保三级Java安全改造全周期实录,从代码审计到渗透验证的12个生死关卡

第一章:等保三级Java安全改造的合规基线与生命周期全景图等保三级对Java应用提出了覆盖身份鉴别、访问控制、安全审计、通信保密性、代码安全及可信执行环境的全维度要求。其合规基线并非静态清单,而是贯穿需求分析、设计开发、测试验证、上线部署与持续…...

OffscreenCanvas黑科技:让你的网页动画性能提升300%的配置指南

OffscreenCanvas黑科技:让你的网页动画性能提升300%的配置指南 当网页动画开始卡顿,用户的体验就会直线下降。传统Canvas渲染在主线程执行,复杂的图形运算很容易阻塞UI响应。OffscreenCanvas的出现彻底改变了这一局面——它允许你将绘制逻辑转…...