1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
| import tkinter as tk from tkinter import ttk, filedialog, messagebox import base64 import re import os from PIL import Image, UnidentifiedImageError
class Base64Tool: def __init__(self, master): self.master = master master.title("Base64全能工具 v2.0") master.geometry("800x600")
self.style = ttk.Style() self.style.configure('TButton', font=('微软雅黑', 10)) self.style.configure('TLabel', font=('微软雅黑', 10))
self.create_widgets() self.setup_bindings()
def create_widgets(self): """创建界面组件""" control_frame = ttk.LabelFrame(self.master, text="功能控制") control_frame.pack(pady=10, padx=10, fill=tk.X)
self.btn_encode = ttk.Button(control_frame, text="编码", command=self.encode) self.btn_encode.grid(row=0, column=0, padx=5)
self.btn_decode = ttk.Button(control_frame, text="解码", command=self.decode) self.btn_decode.grid(row=0, column=1, padx=5)
self.btn_img2base64 = ttk.Button(control_frame, text="图片转Base64", command=self.image_to_base64) self.btn_img2base64.grid(row=0, column=2, padx=5)
self.btn_base64_to_img = ttk.Button(control_frame, text="Base64转图片", command=self.base64_to_image) self.btn_base64_to_img.grid(row=0, column=3, padx=5)
self.chk_filter = tk.BooleanVar() self.chk_autocorrect = tk.BooleanVar()
settings_frame = ttk.LabelFrame(self.master, text="处理设置") settings_frame.pack(pady=10, padx=10, fill=tk.X)
ttk.Checkbutton(settings_frame, text="过滤非Base64字符", variable=self.chk_filter).grid(row=0, column=0, padx=5) ttk.Checkbutton(settings_frame, text="自动纠错", variable=self.chk_autocorrect).grid(row=0, column=1, padx=5)
io_frame = ttk.Frame(self.master) io_frame.pack(expand=True, fill=tk.BOTH, padx=10, pady=5)
self.txt_input = tk.Text(io_frame, height=15, wrap=tk.WORD, font=('Consolas', 10)) self.txt_input.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
self.txt_output = tk.Text(io_frame, height=15, wrap=tk.WORD, font=('Consolas', 10), state="disabled") self.txt_output.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
def setup_bindings(self): """设置事件绑定""" self.master.bind("<Control-e>", lambda e: self.encode()) self.master.bind("<Control-d>", lambda e: self.decode())
def sanitize_base64(self, data): """Base64数据净化处理[^1]""" if self.chk_filter.get(): return re.sub(r'[^A-Za-z0-9+/=]', '', data) return data
def auto_correct(self, data): """自动纠错处理[^3]""" missing_padding = len(data) % 4 if missing_padding: data += '=' * (4 - missing_padding) return data
def encode(self): """Base64编码""" try: input_data = self.txt_input.get("1.0", tk.END).strip() if not input_data: messagebox.showwarning("警告", "输入内容不能为空") return
encoded = base64.b64encode(input_data.encode()).decode() self._set_output(encoded)
except Exception as e: messagebox.showerror("错误", f"编码失败: {str(e)}")
def decode(self): """Base64解码""" try: input_data = self.txt_input.get("1.0", tk.END).strip() input_data = self.sanitize_base64(input_data)
if self.chk_autocorrect.get(): input_data = self.auto_correct(input_data)
decoded = base64.b64decode(input_data).decode() self._set_output(decoded)
except Exception as e: messagebox.showerror("错误", f"解码失败: {str(e)}")
def image_to_base64(self): """图片转Base64""" try: filetypes = [("图片文件", "*.png;*.jpg;*.jpeg;*.gif;*.bmp")] path = filedialog.askopenfilename(filetypes=filetypes)
if not path: return
with open(path, "rb") as f: img_data = f.read()
encoded = base64.b64encode(img_data).decode() self._set_output(encoded) messagebox.showinfo("成功", f"已编码 {os.path.basename(path)}")
except Exception as e: messagebox.showerror("错误", f"图片编码失败: {str(e)}")
def base64_to_image(self): """Base64转图片""" try: input_data = self.txt_input.get("1.0", tk.END).strip() input_data = self.sanitize_base64(input_data)
if self.chk_autocorrect.get(): input_data = self.auto_correct(input_data)
img_data = base64.b64decode(input_data)
Image.open(io.BytesIO(img_data)).verify()
save_path = filedialog.asksaveasfilename( defaultextension=".png", filetypes=[("PNG 文件", "*.png"), ("JPEG 文件", "*.jpg"), ("所有文件", "*.*")] )
if save_path: with open(save_path, "wb") as f: f.write(img_data) messagebox.showinfo("成功", f"图片已保存到 {save_path}")
except UnidentifiedImageError: messagebox.showerror("错误", "无效的图片数据") except Exception as e: messagebox.showerror("错误", f"图片解码失败: {str(e)}")
def _set_output(self, text): """更新输出框内容""" self.txt_output.config(state="normal") self.txt_output.delete(1.0, tk.END) self.txt_output.insert(tk.END, text) self.txt_output.config(state="disabled")
if __name__ == "__main__": root = tk.Tk() app = Base64Tool(root) root.mainloop()
|