[color=]迫于无奈让Deepseek先给我写了计算过程,再来生成的代码,试了一下还是不错。
[color=]为了避免软件的单调性,我也将最基础的多进制相互转换加入了进来
[color=]之前在论坛评论区有这种计算工具,但是无人分享,实属无奈。
[Python] 纯文本查看 复制代码import tkinter as tk
from tkinter import ttk
import struct
import binascii
class BaseConverterApp:
def __init__(self, root):
self.root = root
self.root.title("进制转换器 By JS")
self.root.geometry("900x550")
self.root.configure(bg="#f0f0f0")
# 创建选项卡
self.tab_control = ttk.Notebook(root)
# 创建四个选项卡
self.tab1 = ttk.Frame(self.tab_control)
self.tab2 = ttk.Frame(self.tab_control)
self.tab3 = ttk.Frame(self.tab_control)
self.tab4 = ttk.Frame(self.tab_control) # 新增的第四个选项卡
self.tab_control.add(self.tab1, text='进制转换')
self.tab_control.add(self.tab2, text='16#高前低后')
self.tab_control.add(self.tab4, text='16#低前高后') # 新增的选项卡
self.tab_control.add(self.tab3, text='IEEE754计算')
self.tab_control.pack(expand=1, fill="both")
# 初始化各个选项卡
self.create_tab1()
self.create_tab2()
self.create_tab3()
self.create_tab4() # 初始化新增选项卡
# 状态栏
self.status_bar = tk.Label(root, text="就绪", bd=1, relief=tk.SUNKEN, anchor=tk.W)
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
def update_status(self, message):
self.status_bar.config(text=message)
self.root.after(3000, lambda: self.status_bar.config(text="就绪"))
def create_tab1(self):
# 基本进制转换界面
tab = self.tab1
tab.configure(style='TFrame')
# 标题
title = tk.Label(tab, text="进制相互转换", font=("Arial", 16, "bold"), bg="#f0f0f0")
title.pack(pady=10)
# 输入框和标签
input_frame = tk.Frame(tab, bg="#f0f0f0")
input_frame.pack(pady=10)
tk.Label(input_frame, text="输入数值:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
self.input_entry = tk.Entry(input_frame, width=25, font=("Arial", 12))
self.input_entry.grid(row=0, column=1, padx=5, pady=5)
tk.Label(input_frame, text="输入进制:", bg="#f0f0f0").grid(row=0, column=2, padx=5, pady=5)
self.input_base = ttk.Combobox(input_frame, values=["2", "8", "10", "16"], width=10, state="readonly")
self.input_base.grid(row=0, column=3, padx=5, pady=5)
self.input_base.current(2) # 默认十进制
# 转换按钮
convert_btn = tk.Button(tab, text="转换", command=self.convert_base, bg="#4CAF50", fg="white",
font=("Arial", 12, "bold"), padx=15)
convert_btn.pack(pady=10)
# 结果显示区域
result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
self.result_text = tk.Text(result_frame, height=8, width=70, font=("Consolas", 11), bg="white")
self.result_text.pack(fill=tk.BOTH, expand=True, pady=5)
self.result_text.insert(tk.END, "结果将显示在这里...")
self.result_text.config(state=tk.DISABLED)
# 示例标签
examples = tk.Label(tab, text="示例: 二进制: 1101, 八进制: 75, 十进制: 123, 十六进制: FF",
bg="#f0f0f0", fg="#666")
examples.pack(pady=(0, 10))
def create_tab2(self):
# 16进制转10进制(高位在前)
tab = self.tab2
tab.configure(style='TFrame')
# 标题
title = tk.Label(tab, text="16进制转10进制(高位在前,低位在后)", font=("Arial", 16, "bold"), bg="#f0f0f0")
title.pack(pady=10)
# 说明
desc = tk.Label(tab, text="输入4字节的16进制数据(例如: 01 02 03 04)", bg="#f0f0f0")
desc.pack(pady=5)
# 输入框
input_frame = tk.Frame(tab, bg="#f0f0f0")
input_frame.pack(pady=10)
tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
self.hex_input = tk.Entry(input_frame, width=30, font=("Arial", 12))
self.hex_input.grid(row=0, column=1, padx=5, pady=5)
self.hex_input.insert(0, "01 02 03 04")
# 转换按钮
convert_btn = tk.Button(tab, text="转换", command=self.convert_hex_to_int_big, bg="#2196F3", fg="white",
font=("Arial", 12, "bold"), padx=15)
convert_btn.pack(pady=10)
# 结果区域
result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
self.int_result_big = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
width=30, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
self.int_result_big.pack(fill=tk.X, pady=5)
# 字节顺序解释
explanation = tk.Label(tab,
text="高位在前顺序(大端序): 第一个字节是最高有效字节(例如: 01 02 03 04 → 0x01020304)",
bg="#f0f0f0", fg="#666")
explanation.pack(pady=(5, 10))
# 示例值
examples = tk.Label(tab,
text="示例值: 01 02 03 04 = 16,909,060 | 00 00 00 01 = 1 | FF FF FF FF = 4,294,967,295",
bg="#f0f0f0", fg="#666")
examples.pack(pady=(0, 5))
def create_tab4(self):
# 16进制转10进制(低位在前) - 新增选项卡
tab = self.tab4
tab.configure(style='TFrame')
# 标题
title = tk.Label(tab, text="16进制转10进制(低位在前,高位在后)", font=("Arial", 16, "bold"), bg="#f0f0f0")
title.pack(pady=10)
# 说明
desc = tk.Label(tab, text="输入4字节的16进制数据(例如: 04 03 02 01)", bg="#f0f0f0")
desc.pack(pady=5)
# 输入框
input_frame = tk.Frame(tab, bg="#f0f0f0")
input_frame.pack(pady=10)
tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
self.hex_input_little = tk.Entry(input_frame, width=30, font=("Arial", 12))
self.hex_input_little.grid(row=0, column=1, padx=5, pady=5)
self.hex_input_little.insert(0, "04 03 02 01")
# 转换按钮
convert_btn = tk.Button(tab, text="转换", command=self.convert_hex_to_int_little, bg="#9C27B0", fg="white",
font=("Arial", 12, "bold"), padx=15)
convert_btn.pack(pady=10)
# 结果区域
result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
self.int_result_little = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
width=30, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
self.int_result_little.pack(fill=tk.X, pady=5)
# 字节顺序解释
explanation = tk.Label(tab,
text="低位在前顺序(小端序): 第一个字节是最低有效字节(例如: 04 03 02 01 → 0x01020304)",
bg="#f0f0f0", fg="#666")
explanation.pack(pady=(5, 10))
# 示例值
examples = tk.Label(tab,
text="示例值: 04 03 02 01 = 16,909,060 | 01 00 00 00 = 1 | FF FF FF FF = 4,294,967,295",
bg="#f0f0f0", fg="#666")
examples.pack(pady=(0, 5))
# 对比说明
comparison = tk.Label(tab, text="对比: 高位在前(01 02 03 04)与低位在前(04 03 02 01)的结果相同",
bg="#f0f0f0", fg="#006400", font=("Arial", 9, "italic"))
comparison.pack(pady=(0, 5))
def create_tab3(self):
# IEEE754浮点数转换
tab = self.tab3
tab.configure(style='TFrame')
# 标题
title = tk.Label(tab, text="IEEE754浮点数转换", font=("Arial", 16, "bold"), bg="#f0f0f0")
title.pack(pady=10)
# 输入框
input_frame = tk.Frame(tab, bg="#f0f0f0")
input_frame.pack(pady=10)
tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
self.float_hex_input = tk.Entry(input_frame, width=40, font=("Arial", 12))
self.float_hex_input.grid(row=0, column=1, padx=5, pady=5)
self.float_hex_input.insert(0, "41C80000")
# 选项区域
options_frame = tk.Frame(tab, bg="#f0f0f0")
options_frame.pack(pady=10)
tk.Label(options_frame, text="类型:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
self.float_type = ttk.Combobox(options_frame, values=["单精度浮点 (32位)", "双精度浮点 (64位)"],
width=18, state="readonly")
self.float_type.grid(row=0, column=1, padx=5, pady=5)
self.float_type.current(0)
tk.Label(options_frame, text="字节序:", bg="#f0f0f0").grid(row=0, column=2, padx=5, pady=5)
self.endian_type = ttk.Combobox(options_frame, values=["大端序", "小端序"],
width=8, state="readonly")
self.endian_type.grid(row=0, column=3, padx=5, pady=5)
self.endian_type.current(0)
# 转换按钮
convert_btn = tk.Button(tab, text="转换", command=self.convert_ieee754, bg="#FF9800", fg="white",
font=("Arial", 12, "bold"), padx=15)
convert_btn.pack(pady=10)
# 结果区域
result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
self.float_result = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
width=40, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
self.float_result.pack(fill=tk.X, pady=5)
# IEEE754解释
explanation = tk.Label(tab,
text="IEEE754标准: 单精度浮点(32位)=1符号位+8指数位+23尾数位 | 双精度浮点(64位)=1符号位+11指数位+52尾数位",
bg="#f0f0f0", fg="#666")
explanation.pack(pady=(5, 10))
# 示例值
examples = tk.Label(tab,
text="单精度示例: 41C80000 = 25.0 | C2C80000 = -100.0 | 单精度小端序示例: 0000C842 = 100.0",
bg="#f0f0f0", fg="#666")
examples.pack(pady=(0, 5))
def convert_base(self):
input_val = self.input_entry.get().strip()
base = self.input_base.get()
if not input_val:
self.update_status("错误: 请输入数值")
return
try:
# 将输入值转换为十进制
if base == "2":
decimal = int(input_val, 2)
elif base == "8":
decimal = int(input_val, 8)
elif base == "10":
decimal = int(input_val)
elif base == "16":
decimal = int(input_val, 16)
# 转换为其他进制
binary = bin(decimal)[2:]
octal = oct(decimal)[2:]
hex_val = hex(decimal)[2:].upper()
# 显示结果
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
result = f"十进制: {decimal}\n"
result += f"二进制: {binary}\n"
result += f"八进制: {octal}\n"
result += f"十六进制: {hex_val}"
self.result_text.insert(tk.END, result)
self.result_text.config(state=tk.DISABLED)
self.update_status("转换成功")
except ValueError as e:
self.update_status(f"错误: 无效的输入 - {str(e)}")
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, f"错误: 无效的输入\n{str(e)}")
self.result_text.config(state=tk.DISABLED)
def convert_hex_to_int_big(self):
hex_input = self.hex_input.get().strip()
if not hex_input:
self.update_status("错误: 请输入16进制数据")
return
try:
# 移除空格并确保是8个字符(4字节)
hex_chars = hex_input.replace(" ", "")
if len(hex_chars) != 8:
self.update_status("错误: 需要4字节(8个16进制字符)的数据")
return
# 高位在前转换为整数
int_value = int(hex_chars, 16)
# 显示结果
self.int_result_big.config(text=f"十进制整数: {int_value:,}")
self.update_status("整数转换成功(大端序)")
except ValueError as e:
self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
self.int_result_big.config(text=f"错误: {str(e)}")
def convert_hex_to_int_little(self):
hex_input = self.hex_input_little.get().strip()
if not hex_input:
self.update_status("错误: 请输入16进制数据")
return
try:
# 移除空格并确保是8个字符(4字节)
hex_chars = hex_input.replace(" ", "")
if len(hex_chars) != 8:
self.update_status("错误: 需要4字节(8个16进制字符)的数据")
return
# 将16进制字符串拆分为字节
bytes_list = [hex_chars[i:i + 2] for i in range(0, 8, 2)]
# 反转字节顺序(小端序转换为大端序)
reversed_hex = ''.join(bytes_list[::-1])
# 转换为整数
int_value = int(reversed_hex, 16)
# 显示结果
self.int_result_little.config(text=f"十进制整数: {int_value:,}")
self.update_status("整数转换成功(小端序)")
except ValueError as e:
self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
self.int_result_little.config(text=f"错误: {str(e)}")
def convert_ieee754(self):
hex_input = self.float_hex_input.get().strip().replace(" ", "")
float_type = self.float_type.get()
endian_type = self.endian_type.get()
if not hex_input:
self.update_status("错误: 请输入16进制数据")
return
try:
# 根据选择确定字节长度
if "单精度" in float_type:
byte_len = 4
else:
byte_len = 8
# 检查输入长度
if len(hex_input) != byte_len * 2:
self.update_status(f"错误: 需要 {byte_len} 字节 ({byte_len * 2} 个16进制字符) 的数据")
return
# 转换为字节序列
data = bytes.fromhex(hex_input)
# 处理字节序
if "小端序" in endian_type:
data = data[::-1] # 反转字节顺序
# 转换为浮点数
if "单精度" in float_type:
float_value = struct.unpack('>f', data)[0]
else:
float_value = struct.unpack('>d', data)[0]
# 显示结果
result = f"十进制浮点数: {float_value}"
# 如果是小端序处理,显示说明
if "小端序" in endian_type:
result += f"\n(已从小端序转换)"
self.float_result.config(text=result)
self.update_status("IEEE754转换成功")
except (ValueError, binascii.Error) as e:
self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
self.float_result.config(text=f"错误: {str(e)}")
except struct.error as e:
self.update_status(f"错误: 浮点数转换失败 - {str(e)}")
self.float_result.config(text=f"错误: {str(e)}")
if __name__ == "__main__":
root = tk.Tk()
style = ttk.Style()
style.configure('TFrame', background='#f0f0f0')
app = BaseConverterApp(root)
root.mainloop()
成品地址:https://wwfl.lanzouw.com/iTgNZ36ihcjg