secrets
模块替代random
,符合NIST安全标准pyperclip
实现自动复制,支持跨平台操作功能代码
import tkinter as tk
from tkinter import ttk, messagebox
import secrets
import string
import pyperclip
class PasswordGenerator:
def __init__(self, master):
self.master = master
master.title("安全密码生成器")
master.geometry("400x300")
master.resizable(False, False)
# 控件变量初始化
self.length_var = tk.StringVar(value="12")
self.upper_var = tk.BooleanVar(value=True)
self.lower_var = tk.BooleanVar(value=True)
self.digits_var = tk.BooleanVar(value=True)
self.symbols_var = tk.BooleanVar(value=True)
self.password_var = tk.StringVar()
# 界面布局
self.create_widgets()
def create_widgets(self):
"""构建图形界面"""
# 密码长度输入
ttk.Label(self.master, text="密码长度:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
length_entry = ttk.Entry(self.master, textvariable=self.length_var, width=10)
length_entry.grid(row=0, column=1, sticky="w")
# 字符类型选择
ttk.Checkbutton(self.master, text="大写字母(A-Z)", variable=self.upper_var).grid(row=1, column=0, sticky="w", padx=10)
ttk.Checkbutton(self.master, text="小写字母(a-z)", variable=self.lower_var).grid(row=2, column=0, sticky="w", padx=10)
ttk.Checkbutton(self.master, text="数字(0-9)", variable=self.digits_var).grid(row=3, column=0, sticky="w", padx=10)
ttk.Checkbutton(self.master, text="符号(!@#$)", variable=self.symbols_var).grid(row=4, column=0, sticky="w", padx=10)
# 生成按钮
ttk.Button(self.master, text="生成密码", command=self.generate_password).grid(row=5, column=0, pady=15, columnspan=2)
# 密码显示
ttk.Label(self.master, text="生成结果:").grid(row=6, column=0, padx=10, sticky="w")
result_entry = ttk.Entry(self.master, textvariable=self.password_var, state="readonly", width=25)
result_entry.grid(row=6, column=1, sticky="w")
# 复制按钮
ttk.Button(self.master, text="复制密码", command=self.copy_password).grid(row=7, column=0, pady=10, columnspan=2)
def generate_password(self):
"""核心生成逻辑"""
try:
# 参数校验
length = int(self.length_var.get())
charset = self.build_charset()
# 安全检测
if not charset:
raise ValueError("请至少选择一种字符类型")
if length < 8:
messagebox.showwarning("安全警告", "密码长度建议≥8位!")
# 密码生成
password = ''.join(secrets.choice(charset) for _ in range(length))
self.password_var.set(password)
pyperclip.copy(password) # 自动复制到剪贴板
except ValueError as e:
messagebox.showerror("参数错误", f"输入无效:{str(e)}")
except Exception as e:
messagebox.showerror("系统错误", f"生成失败:{str(e)}")
def build_charset(self):
"""构建字符集"""
charset = ""
if self.upper_var.get(): charset += string.ascii_uppercase
if self.lower_var.get(): charset += string.ascii_lowercase
if self.digits_var.get(): charset += string.digits
if self.symbols_var.get(): charset += string.punctuation
return charset
def copy_password(self):
"""复制到剪贴板"""
if self.password_var.get():
pyperclip.copy(self.password_var.get())
messagebox.showinfo("操作成功", "密码已复制到剪贴板")
if __name__ == "__main__":
root = tk.Tk()
app = PasswordGenerator(root)
root.mainloop()