在日常工作中,文件加密是保护敏感信息的重要手段。今天我将介绍一个基于 Python Tkinter 库开发的文件加密工具,它不仅界面友好,还支持多种加密选项和算法,满足不同场景的加密需求。

工具核心功能

  • 支持多种文件类型加密(文本、代码、Excel等)

  • 提供多种加密模式(二进制、四进制)

  • 支持多种压缩算法(zlib、gzip、bz2等10种)

  • 可自定义压缩次数(不压缩、一次压缩、二次压缩)

  • 文件路径选择和状态显示

界面设计思路

1. 整体布局设计

我使用了现代化UI设计思路:

  • 主窗口尺寸为750x700,足够显示所有控件

  • 使用ttk样式系统创建统一风格

  • 状态栏显示操作状态

  • 分组布局使界面更清晰

class SparrowFileEncryption(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("39文件加密工具")
        self.geometry("750x700")
        self.resizable(True, True)
        
        # 创建样式
        self.style = ttk.Style()
        self.style.configure('TButton', font=('Arial', 10), padding=5)
        self.style.configure('Header.TLabel', font=('Arial', 16, 'bold'), foreground='#2c3e50')
        self.style.configure('Section.TLabel', font=('Arial', 10, 'bold'), foreground='#3498db')
        self.style.configure('Status.TLabel', font=('Arial', 9), foreground='#7f8c8d')
        self.style.configure('Success.TLabel', font=('Arial', 9), foreground='#27ae60')
        
        self.create_widgets()

2. 文件选择区域

文件选择是加密的第一步,我设计了清晰的文件选择按钮和状态显示:

def create_widgets(self):
    # 文件选择部分
    file_frame = ttk.LabelFrame(main_frame, text="文件选择", padding=10)
    file_frame.pack(fill=tk.X, pady=5)

    # 选择文件夹按钮
    folder_btn = ttk.Button(
        file_frame, text="选择加密文件保存文件夹",
        command=self.choose_folder
    )
    folder_btn.pack(fill=tk.X, pady=3)
    
    # 文件夹选择状态
    self.select_folder_text = ttk.Label(
        file_frame, text="未选择文件夹",
        style='Status.TLabel'
    )
    self.select_folder_text.pack(fill=tk.X, pady=(0, 5))

3. 选项设置区域

使用Notebook组件将选项分为两个标签页,使界面更整洁:

# 选项部分 - 使用Notebook进行标签页分组
options_notebook = ttk.Notebook(main_frame)
options_notebook.pack(fill=tk.X, pady=5)

# 压缩和加密模式选项放在同一个标签页
compression_tab = ttk.Frame(options_notebook, padding=10)
options_notebook.add(compression_tab, text="压缩和加密设置")

# 加密算法选项放在另一个标签页
algorithm_tab = ttk.Frame(options_notebook, padding=10)
options_notebook.add(algorithm_tab, text="加密算法")

4. 加密算法选择

支持10种不同的加密算法,使用两列布局展示:

# 加密算法部分 - 最多两排
algorithm_frame = ttk.LabelFrame(algorithm_tab, text="加密算法", padding=5)
algorithm_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

self.algorithm_var = tk.StringVar(value="zlib")

algorithms = ['zlib', 'gzip', 'bz2', 'lzma', 'lz4',
              'brotli', 'snappy', 'huffman', 'deflate', 'lz77']

# 使用两列框架布局
col1_frame = ttk.Frame(algorithm_frame)
col1_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)

col2_frame = ttk.Frame(algorithm_frame)
col2_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)

# 将算法分成两组,每组5个
for i, option in enumerate(algorithms[:5]):
    rb = ttk.Radiobutton(
        col1_frame, text=option,
        variable=self.algorithm_var,
        value=option
    )
    rb.pack(anchor=tk.W, pady=2, padx=5)

5. 文件名和密钥输入

这两个关键信息使用简单的输入框设计:

# 文件名输入
name_frame = ttk.Frame(main_frame)
name_frame.pack(fill=tk.X, pady=3)

name_label = ttk.Label(name_frame, text="加密文件保存名字:", width=18)
name_label.pack(side=tk.LEFT, padx=(0, 5))

self.file_name_entry = ttk.Entry(name_frame)
self.file_name_entry.pack(fill=tk.X, expand=True)

# 密钥输入
key_frame = ttk.Frame(main_frame)
key_frame.pack(fill=tk.X, pady=3)

key_label = ttk.Label(key_frame, text="秘钥:", width=18)
key_label.pack(side=tk.LEFT, padx=(0, 5))

self.key_entry = ttk.Entry(key_frame, show="*")
self.key_entry.pack(fill=tk.X, expand=True)

6. 加密按钮和状态栏

醒目的加密按钮和底部状态栏设计:

# 加密按钮
encrypt_btn = ttk.Button(
    main_frame, text="加密文件",
    command=self.on_encrypt_clicked,
    style='TButton'
)
encrypt_btn.pack(fill=tk.X, pady=10)

# 状态栏
status_bar = ttk.Frame(self, relief=tk.SUNKEN)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)

self.status_text = ttk.Label(
    status_bar, text="就绪",
    anchor=tk.W, style='Status.TLabel'
)
self.status_text.pack(side=tk.LEFT, padx=10)

核心功能实现

1. 文件选择功能

def choose_folder(self):
    folder_path = filedialog.askdirectory(title="选择文件夹")
    if folder_path:
        self.folder_path = folder_path
        folder_name = folder_path.split("/")[-1]
        self.select_folder_text.configure(
            text=f"已选择: {folder_name}",
            style='Success.TLabel'
        )
        self.update_status(f"已选择保存文件夹: {folder_name}")

def choose_file(self):
    file_types = [
        ('Excel文件', '*.xlsx *.xls'),
        ('文本文件', '*.txt'),
        # 支持多种文件类型...
        ('所有文件', '*.*')
    ]

    file_path = filedialog.askopenfilename(
        title="选择要加密的文件",
        filetypes=file_types
    )

    if file_path:
        self.file_path = file_path
        file_name = file_path.split("/")[-1]
        self.select_file_text.configure(
            text=f"已选择: {file_name}",
            style='Success.TLabel'
        )
        self.update_status(f"已选择要加密的文件: {file_name}")

2. 加密核心逻辑

def encryption(self, folder, file, times, function, compress, key, to_file):
    if function == '二进制加密':
        function = 0
    else:
        function = 1

    if times == "二次压缩":
        times = 2
    elif times == "一次压缩":
        times = 1
    else:
        times = 0

    file_type = file.split("/")[-1].split(".")[-1]
    supported_types = [
        "txt", "py", "java", "js", "html", "ipynb", "less", "css", "pcss",
        "scss", "ts", "sass", "c", "cpp", "cc", "C", "cxx", "c++", 'h',
        "php", "go", "kt", "cs", "rb", "pl", "pm", "swift", "sql", "xls",
        "xlsx", "db", 'R', "scala"
    ]

    if file_type in supported_types:
        try:
            self.ef.encryption_txt(file, key, -1, times, function, folder, to_file, file_type, compress)
            messagebox.showinfo("成功", "文件加密成功!")
            self.update_status("文件加密成功!")
        except Exception as e:
            messagebox.showerror("错误", f"加密过程中发生错误:\n{str(e)}")
            self.update_status(f"加密错误: {str(e)}")
    else:
        messagebox.showerror("错误", f"不支持加密 {file_type} 格式的文件")
        self.update_status(f"不支持的文件类型: {file_type}")

3. 加密按钮事件处理

def on_encrypt_clicked(self):
    # 检查是否选择了文件夹和文件
    if not self.folder_path:
        messagebox.showwarning("警告", "请先选择加密文件保存文件夹")
        self.update_status("错误: 未选择保存文件夹")
        return

    if not self.file_path:
        messagebox.showwarning("警告", "请先选择要加密的文件")
        self.update_status("错误: 未选择要加密的文件")
        return

    # 检查文件名和密钥是否为空
    file_name = self.file_name_entry.get().strip()
    if not file_name:
        messagebox.showwarning("警告", "请输入加密文件保存名字")
        self.update_status("错误: 未输入文件名")
        return

    key = self.key_entry.get().strip()
    if not key:
        messagebox.showwarning("警告", "请输入加密秘钥")
        self.update_status("错误: 未输入秘钥")
        return

    # 获取选项值
    times = self.compress_var.get()
    function = self.mode_var.get()
    compress = self.algorithm_var.get()

    self.update_status("正在加密文件,请稍候...")

    # 调用加密方法
    self.encryption(
        self.folder_path,
        self.file_path,
        times,
        function,
        compress,
        key,
        file_name
    )

使用技巧和注意事项

  1. 文件类型支持:工具支持多种编程语言文件和文档格式,包括Python、Java、C++、Excel等

  2. 加密模式选择

    • 二进制加密:适合大多数场景

    • 四进制加密:提供更高级别的安全性

  3. 压缩选项

    • 二次压缩:最高压缩率,适合大型文件

    • 一次压缩:平衡压缩率和速度

    • 不压缩:最快速度,适合小文件

  4. 密钥设置

    • 使用强密码(字母+数字+特殊字符)

    • 记住密钥!丢失密钥将无法解密文件

总结

这个文件加密工具通过Tkinter实现了:

  • 直观的用户界面设计

  • 多种加密算法和压缩选项

  • 完善的错误处理和用户反馈

  • 支持多种常用文件格式

整个工具代码结构清晰,功能完整,可以直接复制使用或根据需要进行扩展。通过合理使用Tkinter的布局和样式系统,即使是命令行工具也可以拥有美观的图形界面。

下载

  1. 文件加密V1.1.0.0

    1. 描述:

      1. 将各种文件进行加密

    2. 下载:

      1. 文件加密.exe