利用Python开发一个简单的密码管理器

沿途有光
沿途有光
发布时间:2026-10-10 | 2人浏览过
原创

本文介绍如何使用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数据库文件进行备份,防止误操作导致数据丢失。

完成判断标准:

  1. 双击运行程序后,数据库文件自动生成,无报错闪退。
  2. 在设置弹窗中填写任意字段并点击添加,主列表实时显示新增行。
  3. 选中某行后点击复制用户名/复制密码,可在外部粘贴框获取正确文本。
  4. 双击列表项能准确唤起对应URL的浏览器页面。

打包发布命令:

pip install pyinstaller
pyinstaller --onefile --windowed password_manager.py

执行后将在dist目录生成独立可执行文件,脱离Python环境即可运行。

安全风险排查与优化建议

本示例侧重功能跑通,实际部署需注意以下隐患与排查路径:

  • 明文存储风险:SQLite未开启加密扩展,敏感数据以纯文本落盘。若需合规使用,应引入cryptography库实施AES-GCM加密,或在写入前使用密钥派生函数处理。
  • 输入校验缺失:表单未拦截非法URL格式或超长字段。建议在提交前增加正则匹配与长度截断,配合wx.MessageBox给出明确警告。
  • 剪贴板残留:复制到剪贴板的密码若未及时清理可能被其他进程读取。可扩展定时清除定时器或使用系统级安全API临时存放。

简要总结

通过本项目,掌握了wxPython控件组合与事件驱动模型,熟悉SQLite轻量级数据库的建表与读写规范,并实践了跨平台系统命令调用的技巧。分层代码组织使得后续接入云同步、密码强度检测或导入导出模块更为顺畅。以上就是利用Python开发桌面密码管理器的详细内容,更多关于Python图形界面开发与本地数据管理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表