import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog
import yaml
import json
import os
class YAMLToJSONConverter:
def __init__(self, root):
self.root = root
self.root.title("YAML to JSON 转换器")
self.root.geometry("1000x700")
# 设置样式
style = ttk.Style()
style.theme_use('clam')
self.setup_ui()
def setup_ui(self):
# 主框架
main_frame = ttk.Frame(self.root, padding="10")
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 配置网格权重
self.root.columnconfigure(0, weight=1)
self.root.rowconfigure(0, weight=1)
main_frame.columnconfigure(1, weight=1)
main_frame.columnconfigure(3, weight=1)
main_frame.rowconfigure(1, weight=1)
# 标题
title_label = ttk.Label(main_frame, text="YAML to JSON 实时转换器",
font=("Arial", 16, "bold"))
title_label.grid(row=0, column=0, columnspan=4, pady=(0, 20))
# YAML输入区域
yaml_frame = ttk.LabelFrame(main_frame, text="YAML 输入", padding="5")
yaml_frame.grid(row=1, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), padx=(0, 10))
yaml_frame.columnconfigure(0, weight=1)
yaml_frame.rowconfigure(0, weight=1)
self.yaml_text = scrolledtext.ScrolledText(yaml_frame, width=45, height=25,
font=("Consolas", 10))
self.yaml_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 按钮区域
button_frame = ttk.Frame(main_frame)
button_frame.grid(row=2, column=0, columnspan=2, pady=10)
ttk.Button(button_frame, text="转换", command=self.convert_yaml_to_json).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="清空", command=self.clear_all).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="加载示例", command=self.load_example).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="保存JSON", command=self.save_json).pack(side=tk.LEFT, padx=5)
# JSON输出区域
json_frame = ttk.LabelFrame(main_frame, text="JSON 输出", padding="5")
json_frame.grid(row=1, column=2, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), padx=(10, 0))
json_frame.columnconfigure(0, weight=1)
json_frame.rowconfigure(0, weight=1)
self.json_text = scrolledtext.ScrolledText(json_frame, width=45, height=25,
font=("Consolas", 10), state=tk.DISABLED)
self.json_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 状态栏
self.status_var = tk.StringVar()
self.status_var.set("就绪")
status_bar = ttk.Label(main_frame, textvariable=self.status_var, relief=tk.SUNKEN)
status_bar.grid(row=3, column=0, columnspan=4, sticky=(tk.W, tk.E), pady=(10, 0))
# 绑定事件
self.yaml_text.bind('<KeyRelease>', self.on_yaml_change)
# 加载默认示例
self.load_example()
def on_yaml_change(self, event=None):
"""当YAML内容改变时自动转换"""
self.convert_yaml_to_json()
def convert_yaml_to_json(self):
"""将YAML转换为JSON"""
try:
yaml_content = self.yaml_text.get("1.0", tk.END).strip()
if not yaml_content:
self.json_text.config(state=tk.NORMAL)
self.json_text.delete("1.0", tk.END)
self.json_text.config(state=tk.DISABLED)
self.status_var.set("YAML内容为空")
return
# 解析YAML
yaml_data = yaml.safe_load(yaml_content)
# 转换为JSON
json_content = json.dumps(yaml_data, indent=2, ensure_ascii=False)
# 显示JSON
self.json_text.config(state=tk.NORMAL)
self.json_text.delete("1.0", tk.END)
self.json_text.insert("1.0", json_content)
self.json_text.config(state=tk.DISABLED)
self.status_var.set("转换成功")
except yaml.YAMLError as e:
self.json_text.config(state=tk.NORMAL)
self.json_text.delete("1.0", tk.END)
self.json_text.insert("1.0", f"YAML解析错误:\n{str(e)}")
self.json_text.config(state=tk.DISABLED)
self.status_var.set("YAML解析错误")
except Exception as e:
self.json_text.config(state=tk.NORMAL)
self.json_text.delete("1.0", tk.END)
self.json_text.insert("1.0", f"转换错误:\n{str(e)}")
self.json_text.config(state=tk.DISABLED)
self.status_var.set("转换错误")
def clear_all(self):
"""清空所有内容"""
self.yaml_text.delete("1.0", tk.END)
self.json_text.config(state=tk.NORMAL)
self.json_text.delete("1.0", tk.END)
self.json_text.config(state=tk.DISABLED)
self.status_var.set("已清空")
def load_example(self):
"""加载示例YAML"""
example_yaml = """# 示例YAML数据
name: 张三
age: 25
hobbies:
- 阅读
- 编程
- 音乐
address:
city: 北京
street: 中关村大街
zip: 100080
skills:
programming:
- Python
- JavaScript
- Java
languages:
- 中文
- English
active: true
"""
self.yaml_text.delete("1.0", tk.END)
self.yaml_text.insert("1.0", example_yaml)
self.status_var.set("已加载示例")
def save_json(self):
"""保存JSON到文件"""
try:
json_content = self.json_text.get("1.0", tk.END).strip()
if not json_content or json_content.startswith("YAML解析错误") or json_content.startswith("转换错误"):
messagebox.showwarning("警告", "没有有效的JSON内容可保存")
return
file_path = filedialog.asksaveasfilename(
defaultextension=".json",
filetypes=[("JSON files", "*.json"), ("All files", "*.*")]
)
if file_path:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(json_content)
self.status_var.set(f"JSON已保存到: {file_path}")
messagebox.showinfo("成功", f"JSON文件已保存到:\n{file_path}")
except Exception as e:
messagebox.showerror("错误", f"保存文件时发生错误:\n{str(e)}")
self.status_var.set("保存失败")
def main():
root = tk.Tk()
app = YAMLToJSONConverter(root)
root.mainloop()
if __name__ == "__main__":
main()