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()
效果图