Viewer.XML_Edit2 のソースコード

import sys
import tkinter as tk
from tkinter import ttk, messagebox
import xml.etree.ElementTree as ET

"""
XMLファイルをツリービューで表示し、要素の値を編集可能にするGUIアプリケーション。

このモジュールは、tkinterとxml.etree.ElementTreeライブラリを使用して、
XMLファイルの構造をグラフィカルに表示し、ユーザーが特定のXML要素のテキスト値を
ダブルクリックで編集できるようにする基盤を提供します。
コマンドライン引数でXMLファイルのパスとウィンドウサイズを指定できます。

:doc:`XML_Edit2_usage`
"""

file_path = '../XML/vasprun.xml'
window_size = '800x600'

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


[ドキュメント] class XMLViewerEditor: """ XMLファイルの表示と編集を行うためのGUIアプリケーションクラス。 このクラスは、tkinterのttk.Treeviewウィジェットを使用してXML構造を階層的に表示します。 ユーザーはツリービュー内の要素をダブルクリックすることで、そのテキスト値を編集する準備ができます。 """ def __init__(self, root, file_path, window_size): """ XMLViewerEditorクラスのコンストラクタ。GUIを初期化し、XMLファイルを読み込む。 Tkinterのルートウィンドウを設定し、Treeviewウィジェットを作成してパックします。 指定されたXMLファイルを読み込み、その内容をツリービューに表示します。 また、セル編集のためのイベントバインディング(ダブルクリック)も設定します。 :param root: tk.Tk: Tkinterのルートウィンドウオブジェクト。 :param file_path: str: 読み込むXMLファイルのパス。 :param window_size: str: ウィンドウの初期サイズ(例: "800x600")。 :returns: None """ self.root = root self.root.title("XML Viewer and Editor") self.root.geometry(window_size) self.tree = ttk.Treeview(self.root, columns=("Value")) self.tree.heading('#0', text='Element') self.tree.heading('Value', text='Value') self.tree.pack(fill='both', expand=True) self.load_xml(file_path) self.tree.bind("<Double-1>", self.edit_cell)
[ドキュメント] def load_xml(self, file_path): """ 指定されたXMLファイルを解析し、アプリケーションのルート要素を設定する。 `xml.etree.ElementTree.parse()` を使用してXMLファイルを解析し、 そのルート要素を `self.root_element` に格納します。 その後、`display_element` メソッドを呼び出してツリービューに表示します。 ファイルの解析に失敗した場合は、エラーメッセージを標準出力に表示します。 :param file_path: str: 読み込むXMLファイルのパス。 :returns: None """ try: tree = ET.parse(file_path) self.root_element = tree.getroot() self.display_element(self.root_element, "") except ET.ParseError as e: print("Error:", str(e))
[ドキュメント] def display_element(self, element, parent_id): """ XML要素を再帰的にTreeviewウィジェットに表示する。 指定されたXML要素、その属性、および子要素をTreeviewに階層的に挿入します。 各要素のタグはTreeviewのテキストとして、そのテキストコンテンツは「Value」列に表示されます。 要素の属性は、その要素の子として表示されます。 :param element: xml.etree.ElementTree.Element: 表示するXML要素オブジェクト。 :param parent_id: str: Treeviewにおける親要素のID。トップレベル要素の場合は空文字列。 :returns: None """ item = self.tree.insert(parent_id, "end", text=element.tag, values=(element.text,)) for key, value in element.attrib.items(): self.tree.insert(item, "end", text=f"{key}: {value}") for child in element: self.display_element(child, item)
[ドキュメント] def edit_cell(self, event): """ Treeviewのセルがダブルクリックされたときに、編集モードを開始する。 ダブルクリックされたTreeviewのアイテムと列を特定します。 もしクリックされたのが「Value」列(`#1`列)であれば、そのセルを編集可能な状態にする準備をします。 (現行の実装では、選択されたアイテムをオープンにし、フォーカスを設定する動作です。) :param event: tkinter.Event: ダブルクリックイベントオブジェクト。 :returns: None """ item = self.tree.selection()[0] col = self.tree.identify_column(event.x) print(f"edit col {col}") if col == '#1': # Check if the user clicked on the 'Value' column # if col == '#2': # Check if the user clicked on the 'Value' column self.tree.item(item, values=(self.tree.item(item, 'Value'),), open=True) self.tree.focus(item, "Value") self.tree.selection_set(item, "Value") self.tree.item(item, open=True)
if __name__ == "__main__": root = tk.Tk() app = XMLViewerEditor(root, file_path, window_size) root.mainloop()