todo

python yaml to json realtime convert

up:2025-08-08 14:06:26 edit:2025-08-08 14:06:26 view:57
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()
TAGS: python yaml

not in sinaapp