利用Python开发一个简单的密码管理器
本文介绍如何使用Python结合wxPython与SQLite构建轻量级桌面密码管理器。内容涵盖依赖环境配置、数据库CRUD封装、图形界面布局、剪贴板交互逻辑、跨平台URL调用及PyInstaller打包流程。通过分层架构设计与标准控件绑定,实现账号信息的持久化存储与安全录入,并提供完整的运行验证与本地部署方案。
项目目标与运行效果
本项目的核心目标是解决多账号频繁切换时的记忆负担,通过图形界面实现密码的集中管理、快速检索与一键复制。应用采用分层架构,将数据存储、界面渲染与业务逻辑解耦,确保在Windows、macOS与Linux环境下均可稳定运行。最终交付的可执行程序具备添加记录、编辑信息、直接跳转登录页及剪贴板同步功能。

环境与依赖准备
在开始编码前,需确认基础运行环境并安装第三方库。建议使用Python 3.6及以上版本,通过包管理器统一安装依赖:
# 安装图形界面框架、剪贴板工具库
pip install wxpython pyperclip
# 验证环境(可选)
python -c "import wx, sqlite3, pyperclip; print('依赖正常')"
核心代码编写流程
第1步:封装SQLite数据层
目的:建立本地持久化存储通道,负责表结构初始化与基础CRUD操作。入口为模块实例化,动作是连接数据库并创建表。重要参数包括表名与字段类型。
import sqlite3
class Database:
def __init__(self):
self.conn = sqlite3.connect("password_manager.db")
self.create_table()
def create_table(self):
self.conn.execute("""
CREATE TABLE IF NOT EXISTS accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_name TEXT,
url TEXT,
username TEXT,
password TEXT
)
""")
self.conn.commit()
第2步:构建主窗口与设置对话框
目的:提供可视化操作入口。使用wx.Frame作为主容器,搭配wx.ListCtrl展示记录,通过wx.FlexGridSizer排列表单控件。
class MainFrame(wx.Frame):
def __init__(self):
super().__init__(None, title="密码管理器")
self.init_ui()
def init_ui(self):
panel = wx.Panel(self)
# 使用详细报表样式与单选限制
self.project_list = wx.ListCtrl(panel, style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
# 按钮组水平排列
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.open_url_btn = wx.Button(panel, label="打开网页")
self.copy_username_btn = wx.Button(panel, label="复制用户名")
self.copy_password_btn = wx.Button(panel, label="复制密码")
self.settings_btn = wx.Button(panel, label="设置")
btn_sizer.Add(self.open_url_btn, 0, wx.EXPAND)
btn_sizer.Add(self.copy_username_btn, 0, wx.EXPAND)
btn_sizer.Add(self.copy_password_btn, 0, wx.EXPAND)
btn_sizer.Add(self.settings_btn, 0, wx.EXPAND)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.project_list, 1, wx.EXPAND | wx.ALL, 5)
main_sizer.Add(btn_sizer, 0, wx.EXPAND | wx.ALL, 5)
panel.SetSizer(main_sizer)
第3步:绑定事件与剪贴板交互
目的:将用户操作映射到业务逻辑。需要处理列表选中、双击激活及按钮点击事件,并利用pyperclip实现跨平台文本读写。注意每次数据变更后强制刷新列表,避免状态不一致。
import pyperclip
def bind_events(self):
# 按钮绑定
self.add_btn.Bind(wx.EVT_BUTTON, self.on_add)
self.update_btn.Bind(wx.EVT_BUTTON, self.on_update)
self.delete_btn.Bind(wx.EVT_BUTTON, self.on_delete)
# 列表交互
self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_item_selected)
self.project_list.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_open_url)
def on_copy_username(self, event):
record = self.get_selected_record()
if record:
pyperclip.copy(record[3])
wx.MessageBox("用户名已复制到剪贴板!", "信息", wx.OK | wx.ICON_INFORMATION)
第4步:实现跨平台网页调用
目的:在点击打开网页按钮时,自动识别当前操作系统并启动默认浏览器访问对应URL。入口为主界面方法,动作为调用subprocess.run。
import platform
import subprocess
def on_open_url(self, event):
record = self.get_selected_record()
if record:
url = record[2]
try:
system = platform.system()
if system == "Windows":
subprocess.run(["start", "chrome", url], shell=True)
elif system == "Darwin": # macOS
subprocess.run(["open", "-a", "Google Chrome", url])
else: # Linux
subprocess.run(["google-chrome", url])
except Exception as e:
wx.MessageBox(f"无法打开Chrome浏览器: {str(e)}", "错误", wx.OK | wx.ICON_ERROR)
本地打包与功能验证
开发调试完成后,需进行完整性测试与发布准备。在尝试覆盖旧文件或重新编译前,请务必对当前的password_manager.db数据库文件进行备份,防止误操作导致数据丢失。
完成判断标准:
- 双击运行程序后,数据库文件自动生成,无报错闪退。
- 在设置弹窗中填写任意字段并点击
添加,主列表实时显示新增行。 - 选中某行后点击
复制用户名/复制密码,可在外部粘贴框获取正确文本。 - 双击列表项能准确唤起对应URL的浏览器页面。
打包发布命令:
pip install pyinstaller
pyinstaller --onefile --windowed password_manager.py
执行后将在dist目录生成独立可执行文件,脱离Python环境即可运行。
安全风险排查与优化建议
本示例侧重功能跑通,实际部署需注意以下隐患与排查路径:
- 明文存储风险:SQLite未开启加密扩展,敏感数据以纯文本落盘。若需合规使用,应引入
cryptography库实施AES-GCM加密,或在写入前使用密钥派生函数处理。 - 输入校验缺失:表单未拦截非法URL格式或超长字段。建议在提交前增加正则匹配与长度截断,配合
wx.MessageBox给出明确警告。 - 剪贴板残留:复制到剪贴板的密码若未及时清理可能被其他进程读取。可扩展定时清除定时器或使用系统级安全API临时存放。
简要总结
通过本项目,掌握了wxPython控件组合与事件驱动模型,熟悉SQLite轻量级数据库的建表与读写规范,并实践了跨平台系统命令调用的技巧。分层代码组织使得后续接入云同步、密码强度检测或导入导出模块更为顺畅。以上就是利用Python开发桌面密码管理器的详细内容,更多关于Python图形界面开发与本地数据管理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









