密码管理工具

import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import sqlite3
import pyperclip
import os
from cryptography.fernet import Fernet

class PasswordManager:
    def __init__(self, master_password, storage_file="C:\\Program Files\\ftMmanager\\ftMpass\\HXMLOVEChenpASssWord.db"):
        self.master_password = master_password
        self.storage_file = storage_file
        self._create_directories()  # 创建目录
        self.fernet = Fernet(self._load_or_generate_key())
        self.conn = sqlite3.connect(self.storage_file)
        self.create_table()

    def _create_directories(self):
        directories = [
            os.path.dirname(self.storage_file),
            "C:\\Program Files\\ftMmanager\\ftMkey\\"  # 添加键文件目录
        ]
        for directory in directories:
            if not os.path.exists(directory):
                os.makedirs(directory)

    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''CREATE TABLE IF NOT EXISTS passwords
                          (id INTEGER PRIMARY KEY, username TEXT, password TEXT, note TEXT)''')
        self.conn.commit()

    def _load_or_generate_key(self):
        key_file = "C:\\Program Files\\ftMmanager\\ftMkey\\HXMLOVEChenpASssWord.key"
        if not os.path.exists(key_file):
            key = Fernet.generate_key()
            with open(key_file, 'wb') as f:
                f.write(key)
        with open(key_file, 'rb') as f:
            return f.read()

    def add_password(self, username, password, note):
        cursor = self.conn.cursor()
        cursor.execute("INSERT INTO passwords (username, password, note) VALUES (?, ?, ?)",
                       (username, password, note))
        self.conn.commit()

    def delete_password(self, password_id):
        cursor = self.conn.cursor()
        cursor.execute("DELETE FROM passwords WHERE id=?", (password_id,))
        self.conn.commit()

    def get_all_passwords(self):
        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM passwords")
        return cursor.fetchall()

class PasswordManagerGUI:
    def __init__(self, master, password_manager):
        self.master = master
        self.password_manager = password_manager
        self.master.title("密码管理器 by Fright_Moch V1.0")

        self.show_passwords_var = tk.BooleanVar(value=False)

        self.username_label = tk.Label(self.master, text="用户名:")
        self.username_label.grid(row=0, column=0)
        self.username_entry = tk.Entry(self.master)
        self.username_entry.grid(row=0, column=1)

        self.password_label = tk.Label(self.master, text="密码:")
        self.password_label.grid(row=1, column=0)
        self.password_entry = tk.Entry(self.master, show="*")  # 密码输入框显示*
        self.password_entry.grid(row=1, column=1)

        self.note_label = tk.Label(self.master, text="备注:")
        self.note_label.grid(row=2, column=0)
        self.note_entry = tk.Entry(self.master)
        self.note_entry.grid(row=2, column=1)

        self.show_password_checkbox = tk.Checkbutton(self.master, text="显示密码", variable=self.show_passwords_var,
                                                     command=self.toggle_password_visibility)
        self.show_password_checkbox.grid(row=3, column=1, sticky="w")

        self.add_button = tk.Button(self.master, text="添加", command=self.add_password)
        self.add_button.grid(row=4, column=0, columnspan=2, sticky="we")

        self.tree = ttk.Treeview(self.master, columns=("用户名", "密码", "备注"))
        self.tree.heading("#0", text="", anchor=tk.CENTER)
        self.tree.heading("用户名", text="用户名", anchor=tk.CENTER)
        self.tree.heading("密码", text="密码", anchor=tk.CENTER)
        self.tree.heading("备注", text="备注", anchor=tk.CENTER)
        self.tree.column("#0", stretch=tk.NO, minwidth=0, width=0)
        self.tree.column("用户名", stretch=tk.YES, minwidth=150, width=150)
        self.tree.column("密码", stretch=tk.YES, minwidth=150, width=150)
        self.tree.column("备注", stretch=tk.YES, minwidth=150, width=150)
        self.tree.grid(row=5, column=0, columnspan=2, sticky="nsew")
        self.tree.bind("<ButtonRelease-1>", self.on_tree_select)

        self.copy_button = tk.Button(self.master, text="复制密码", command=self.copy_password)
        self.copy_button.grid(row=6, column=0, columnspan=2, sticky="we")

        self.delete_button = tk.Button(self.master, text="删除", command=self.delete_password)
        self.delete_button.grid(row=7, column=0, columnspan=2, sticky="we")

        self.load_passwords()

    def add_password(self):
        username = self.username_entry.get()
        password = self.password_entry.get()
        note = self.note_entry.get()
        self.password_manager.add_password(username, password, note)
        self.load_passwords()
        messagebox.showinfo("成功", "密码已成功添加!")

    def load_passwords(self):
        self.tree.delete(*self.tree.get_children())
        passwords = self.password_manager.get_all_passwords()
        for password in passwords:
            username, password, note, password_id = password[1], password[2], password[3], password[0]
            if self.show_passwords_var.get():
                self.tree.insert("", tk.END, values=(username, password, note, password_id))
            else:
                self.tree.insert("", tk.END, values=(username, "**", note, password_id))

    def delete_password(self):
        selection = self.tree.selection()
        if selection:
            item = self.tree.item(selection[0])
            password_id = item['values'][3]  # 获取选中行的密码ID
            self.password_manager.delete_password(password_id)
            self.load_passwords()
            messagebox.showinfo("成功", "密码已成功删除!")
        else:
            messagebox.showwarning("警告", "请选择要删除的密码!")

    def on_tree_select(self, event):
        self.selected_item = self.tree.selection()[0]

    def copy_password(self):
        if hasattr(self, 'selected_item'):
            item = self.tree.item(self.selected_item)
            password_id = item['values'][3]
            username = item['values'][0]
            note = item['values'][2]
            cursor = self.password_manager.conn.cursor()
            cursor.execute("SELECT password FROM passwords WHERE id=?", (password_id,))
            original_password = cursor.fetchone()[0]
            copied_text = f"用户名: {username}, 密码: {original_password}, 备注: {note}"
            pyperclip.copy(copied_text)
            messagebox.showinfo("成功", "用户名、密码和备注已复制到剪贴板!")
        else:
            messagebox.showwarning("警告", "请选择一行密码!")

    def toggle_password_visibility(self):
        if self.show_passwords_var.get():
            self.load_passwords()
        else:
            self.load_passwords()


class PasswordManagerLogin:
    def __init__(self, master):
        self.master = master
        self.master.title("密码管理器 - 登录")

        self.password_manager = PasswordManager("0715")

        self.password_label = tk.Label(master, text="请输入密码:")
        self.password_label.grid(row=0, column=0)

        self.password_entry = tk.Entry(master, show="*")
        self.password_entry.grid(row=0, column=1)

        self.login_button = tk.Button(master, text="登录", command=self.login)
        self.login_button.grid(row=1, column=0, columnspan=2, sticky="we")

    def login(self):
        entered_password = self.password_entry.get()
        if entered_password == self.password_manager.master_password:
            self.master.destroy()
            root = tk.Tk()
            password_manager = PasswordManager("0715")
            app = PasswordManagerGUI(root, password_manager)
            root.mainloop()
        else:
            messagebox.showerror("错误", "密码错误!")


def main():
    root = tk.Tk()
    app = PasswordManagerLogin(root)
    root.mainloop()


if __name__ == "__main__":
    main()

效果图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值