Viewer.JSONView のソースコード

import os
import sys
import toml
import tkinter as tk
from tkinter import ttk
import json

"""
JSONView.py

概要: JSONファイルをツリービューで表示するGUIアプリケーション。

詳細説明:
    Tkinterとttk.Treeviewを使用して、JSONデータの階層構造を視覚的に表示します。
    アプリケーションはコマンドライン引数またはINIファイルから初期のウィンドウサイズを読み込みます。
    終了時には、現在のウィンドウサイズがINIファイルに保存されます。

関連リンク: :doc:`JSONView_usage`
"""

if len(sys.argv) <= 1:
    print("Usage: python xml_viewer.py infile window_size")
    sys.exit(1)

geometry = "600x400"  # ウィンドウのデフォルトサイズ

inifile = os.path.splitext(sys.argv[0])[0] + ".ini"
if os.path.isfile(inifile): 
    geometry = toml.load(inifile).get("geometry", geometry)

nargs = len(sys.argv)
if nargs >= 2:
    infile = sys.argv[1]
if nargs >= 3:
    geometry = sys.argv[2]

[ドキュメント] def load_json(filename): """ 概要: 指定されたJSONファイルからデータを読み込む。 詳細説明: ファイルパスからJSONデータをパースし、Pythonの辞書またはリストとして返します。 この関数は、JSON形式のデータを含むテキストファイルを読み込むために使用されます。 :param filename: str: 読み込むJSONファイルのパス。 :returns: dict | list: 読み込まれたJSONデータ。JSONのルート要素が辞書の場合はdict、リストの場合はlist。 """ with open(filename, "r") as file: return json.load(file)
[ドキュメント] def insert_item(tree, parent, key, value): """ 概要: TreeviewウィジェットにJSONデータ項目を挿入する。 詳細説明: JSONの構造(辞書、リスト、プリミティブ値)に応じて、 Treeviewに適切なノードを作成し、再帰的に子要素を挿入します。 辞書はキーと値のペアとして展開され、リストはインデックス付きのアイテムとして表示されます。 プリミティブ値(文字列、数値、真偽値など)はキーと値の列に直接表示されます。 :param tree: ttk.Treeview: データを挿入するTreeviewウィジェットのインスタンス。 :param parent: str: 親ノードのID。ルートレベルの項目を挿入する場合は空文字列 ''。 :param key: str: 現在のアイテムのキー(辞書の場合)または表示名(リストのアイテムの場合)。 :param value: Any: 現在のアイテムの値。これは辞書、リスト、またはプリミティブ値のいずれかです。 :returns: None """ if isinstance(value, dict): node = tree.insert(parent, 'end', text=str(key), open=False) for subkey, subvalue in value.items(): insert_item(tree, node, subkey, subvalue) elif isinstance(value, list): node = tree.insert(parent, 'end', text=str(key) + '[]', open=False) for i, item in enumerate(value): insert_item(tree, node, f'Item {i}', item) else: tree.insert(parent, 'end', text=str(key), value=str(value))
[ドキュメント] def build_tree(tree, data): """ 概要: Treeviewウィジェットの列を設定し、JSONデータを読み込んで表示する。 詳細説明: Treeviewウィジェットの列を「Key」と「Value」として設定し、それぞれの幅とヘッダーを定義します。 その後、与えられたJSONデータのトップレベルのキーと値を使って `insert_item` 関数を呼び出し、ツリー構造を再帰的に構築します。 :param tree: ttk.Treeview: データを表示するTreeviewウィジェットのインスタンス。 :param data: dict: 表示するJSONデータ(ルートが辞書であると仮定)。 :returns: None """ tree["columns"] = ("one",) tree.column("#0", width=270, minwidth=270, stretch=tk.NO) tree.column("one", width=150, minwidth=150, stretch=tk.NO) tree.heading("#0", text="Key", anchor=tk.W) tree.heading("one", text="Value", anchor=tk.W) for key, value in data.items(): insert_item(tree, '', key, value)
[ドキュメント] def window_close(root): """ 概要: ウィンドウを閉じる際の処理を実行する。 詳細説明: アプリケーションが終了する際に呼び出されるコールバック関数です。 現在のウィンドウのジオメトリ(サイズと位置)をINIファイルに保存します。 これにより、次回のアプリケーション起動時に同じウィンドウサイズが復元されます。 その後、Tkinterアプリケーションを正常に終了させます。 :param root: tk.Tk: メインのTkinterウィンドウオブジェクトのインスタンス。 :returns: None """ with open(inifile, "w") as file: toml.dump({"geometry": root.geometry()}, file) root.quit()
[ドキュメント] def main(infile, geometry): """ 概要: JSONビューアアプリケーションのメイン処理を実行する。 詳細説明: Tkinterウィンドウを初期化し、指定されたJSONファイルを読み込み、 その内容をttk.Treeviewウィジェットに表示します。 ウィンドウのタイトル、初期サイズ、およびウィンドウが閉じられた際の処理を設定します。 最後に、Tkinterのイベントループを開始し、GUIの表示とユーザー操作を処理します。 :param infile: str: 表示するJSONファイルのパス。 :param geometry: str: ウィンドウの初期サイズと位置を示す文字列(例: "600x400")。 :returns: None """ root = tk.Tk() root.title(f"JSON Viewer - {infile}") root.geometry(geometry) root.protocol("WM_DELETE_WINDOW", lambda: window_close(root)) tree = ttk.Treeview(root) data = load_json(infile) build_tree(tree, data) tree.pack(side='top', fill='both', expand=True) root.mainloop()
if __name__ == "__main__": main(infile, geometry)