This commit is contained in:
2025-03-11 22:51:52 +08:00
commit 94c810e5f9
5 changed files with 958 additions and 0 deletions

199
main.py Normal file
View File

@@ -0,0 +1,199 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文本与二进制互转GUI程序
支持全Unicode字符集的实时双向转换
"""
import tkinter as tk
from tkinter import ttk, scrolledtext
import time
class BinaryConverter:
"""二进制转换器核心类"""
@staticmethod
def text_to_binary(text):
"""
将文本转换为二进制字符串
使用UTF-8编码每个字节转为8位二进制
"""
try:
# 将文本转换为UTF-8编码的字节
byte_data = text.encode('utf-8')
# 将每个字节转换为8位二进制字符串补前导零
binary_strings = [f"{byte:08b}" for byte in byte_data]
# 用空格分隔每8位方便阅读
return ' '.join(binary_strings)
except Exception as e:
print(f"文本转二进制错误: {e}")
return ""
@staticmethod
def binary_to_text(binary):
"""
将二进制字符串转换为文本
移除所有非0/1字符然后按8位分组解码
"""
try:
# 移除所有非0/1字符包括空格
clean_binary = ''.join(c for c in binary if c in '01')
# 检查长度是否为8的倍数
if len(clean_binary) % 8 != 0:
raise ValueError("二进制长度必须是8的倍数")
# 将二进制字符串按8位分组
byte_strings = [clean_binary[i:i+8] for i in range(0, len(clean_binary), 8)]
# 将每组二进制转换为整数,然后转换为字节
byte_data = bytes([int(byte, 2) for byte in byte_strings])
# 将字节解码为UTF-8文本
return byte_data.decode('utf-8')
except UnicodeDecodeError:
raise ValueError("无效的UTF-8编码二进制数据")
except Exception as e:
raise ValueError(f"二进制转文本错误: {e}")
class BinaryConverterApp:
"""二进制转换器应用程序"""
def __init__(self, root):
self.root = root
self.root.title("二进制双向转换器")
self.root.geometry("1000x600")
# 标记变量,防止无限循环更新
self.updating_text = False
self.updating_binary = False
self.setup_ui()
def setup_ui(self):
"""设置用户界面"""
# 创建主框架
main_frame = ttk.Frame(self.root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# 创建两个并排的文本框
text_frame = ttk.LabelFrame(main_frame, text="文本输入区", padding="5")
text_frame.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
binary_frame = ttk.LabelFrame(main_frame, text="二进制输入区", padding="5")
binary_frame.grid(row=0, column=1, sticky="nsew", padx=5, pady=5)
# 配置网格权重,使文本框可以均匀扩展
main_frame.columnconfigure(0, weight=1)
main_frame.columnconfigure(1, weight=1)
main_frame.rowconfigure(0, weight=1)
# 创建文本输入框
self.text_input = scrolledtext.ScrolledText(text_frame, wrap=tk.WORD, width=40, height=20)
self.text_input.pack(fill=tk.BOTH, expand=True)
# 创建二进制输入框
self.binary_input = scrolledtext.ScrolledText(binary_frame, wrap=tk.WORD, width=40, height=20)
self.binary_input.pack(fill=tk.BOTH, expand=True)
# 创建状态栏
self.status_var = tk.StringVar()
self.status_var.set("就绪 | 文本长度: 0字符 | 二进制长度: 0位")
status_bar = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)
# 绑定事件
self.text_input.bind("<KeyRelease>", self.on_text_change)
self.binary_input.bind("<KeyRelease>", self.on_binary_change)
def on_text_change(self, event=None):
"""当文本输入框内容变化时调用"""
# 防止无限循环更新
if self.updating_binary:
return
self.updating_text = True
# 获取文本内容
text = self.text_input.get("1.0", tk.END).rstrip("\n")
# 测量转换时间
start_time = time.time()
# 转换为二进制
binary = BinaryConverter.text_to_binary(text)
# 计算转换时间(毫秒)
conversion_time = (time.time() - start_time) * 1000
# 更新二进制输入框
self.binary_input.delete("1.0", tk.END)
self.binary_input.insert("1.0", binary)
# 更新状态栏
self.update_status(text, binary, conversion_time)
self.updating_text = False
def on_binary_change(self, event=None):
"""当二进制输入框内容变化时调用"""
# 防止无限循环更新
if self.updating_text:
return
self.updating_binary = True
# 获取二进制内容
binary = self.binary_input.get("1.0", tk.END).rstrip("\n")
# 测量转换时间
start_time = time.time()
try:
# 尝试转换为文本
text = BinaryConverter.binary_to_text(binary)
# 更新文本输入框
self.text_input.delete("1.0", tk.END)
self.text_input.insert("1.0", text)
# 计算转换时间(毫秒)
conversion_time = (time.time() - start_time) * 1000
# 更新状态栏
self.update_status(text, binary, conversion_time)
except ValueError as e:
# 二进制格式错误,显示错误消息
self.status_var.set(f"错误: {e} | 保持原文本显示")
self.updating_binary = False
def update_status(self, text, binary, conversion_time):
"""更新状态栏信息"""
# 计算文本长度(字符数)
text_length = len(text)
# 计算二进制长度(位数)
# 移除所有非0/1字符
clean_binary = ''.join(c for c in binary if c in '01')
binary_length = len(clean_binary)
# 更新状态栏
self.status_var.set(
f"转换耗时: {conversion_time:.2f}ms | "
f"文本长度: {text_length}字符 | "
f"二进制长度: {binary_length}"
)
def main():
"""主函数"""
root = tk.Tk()
app = BinaryConverterApp(root)
root.mainloop()
if __name__ == "__main__":
main()