Launcher.py 技術ドキュメント

プログラムの動作

Launcher.py は、Pythonで記述されたGUIベースのアプリケーションランチャーです。このプログラムの主要な目的は、ユーザーが事前に定義したアプリケーションやスクリプトを、使いやすいグラフィカルインターフェースを通じて簡単に起動できるようにすることです。

主な機能は以下の通りです。

  • GUIによるアプリケーション起動: tkinter を利用した直感的なインターフェースを提供し、リストボックス形式のメインメニューと、関連するアクションを実行するためのサブメニューボタン、ツールバーボタン、右サイドバーボタンを配置します。

  • 設定管理: アプリケーションの設定は .ini ファイル(例: Launcher.ini)に保存・読み込みされます。これにより、パス、フォントサイズ、外部アプリケーションの場所などの設定を永続化できます。

  • スクリプトリストの動的な読み込み: 特定のディレクトリ (launcher_script_dir) から .ini ファイル形式のスクリプト定義を読み込み、ランチャーのメニュー項目として動的に表示します。また、-s コマンドライン引数で指定される .list ファイルによって、追加 (extra_scripts) や除外 (remove_scripts) するスクリプトを管理できます。

  • 環境変数の管理: PYTHONPATH を含む環境変数をプログラムの起動時に設定し、外部アプリケーションやスクリプトが正しく動作するための環境を準備します。

  • ログ出力: アプリケーションの実行ログを、指定されたログファイル (Launcher-out.txt など) に出力する機能を持ちます。

  • 多言語対応: resource_*.resource ファイルを通じて、UIの表示テキストを日本語と英語に切り替えることができます。

このプログラムは、特定のプロジェクト環境下で複数のツールやスクリプトを効率的に管理・実行する際のハブとしての役割を果たすことを目的としています。

原理

Launcher.py は主に tkinter ライブラリとそのカスタムラッパーである tklib を利用してGUIを構築しています。プログラムの動作原理は以下の要素に基づいています。

  1. パス解決と環境設定:

    • プログラム起動時、まず自身のスクリプトパス (sys.argv[0]) を基準に、関連するライブラリ (tklib) のパスを特定します。具体的には、tklibPath 環境変数が設定されていればそれを優先し、なければ相対パス ../../tklib/python を解決して sys.path に追加します。

    • また、アプリケーションのルートディレクトリ (tkProg_Root)、各種実行ファイル (bin_path)、ライブラリ (perllib_path など)、外部アプリケーション (tkapp_path など) のパスを特定し、これらを環境変数 (os.environ) に設定します。これにより、起動されるサブプロセスがこれらのパスを参照できるようになります。

  2. 設定ファイルの管理:

    • tklib.tkparams.tkParams クラスを使用して、アプリケーション全体の設定を .ini ファイルから読み込み、また終了時に保存します。このファイルはユーザー固有のディレクトリ(例: Windowsなら AppData/Local/launcher、Linuxなら ~/.launcher)に格納されます。

    • コマンドライン引数 (-s) や環境変数も設定パラメータとして処理されます。

  3. GUI構築とイベント処理:

    • tkApplication_GUI (およびそれを継承した tkLauncherApp) を基盤として、メインウィンドウ、メニューバー、ツールバー、および複数のフレームに分割されたメインコンテンツ領域を作成します。

    • メインメニュー: 左側のリストボックスには、launcher_script_dir 内の .ini ファイルで定義されたメインメニュー項目が表示されます。

    • サブメニュー/アクションボタン: メインメニューで項目を選択すると、その項目に関連付けられたサブメニューボタンが動的に更新されます。これらのボタンは、tkscript_macro.tkScript エンジンを通じて、特定のコマンドやスクリプトを実行します。

    • イベントハンドラ: ボタンクリックやリストボックスの選択などのユーザーイベントは、対応するPython関数にバインドされ、これらの関数が tkScript エンジンを呼び出して外部プロセスを起動したり、UIを更新したりします。

  4. スクリプト実行エンジン:

    • tklib.tkscript_macro.tkScript は、設定ファイルで定義されたコマンドを実行するためのエンジンです。

    • .ini ファイル内の [SectionName] とその配下のキー(command, caption, task など)に基づいて、実行するアプリケーションのパス、引数、作業ディレクトリなどを構築し、シェルコマンドとして実行します。

    • 実行は通常、subprocess モジュールなどのOSレベルの機能を使用して行われます。

  5. 科学定数と関数:

    • numpy から exp, log, sin, cos などの基本的な数学関数がインポートされています。また、tklib.tksci.tksci からプランク定数 (\(h\), \(\hbar\)), 電気素量 (\(e\)), ボルツマン定数 (\(k_B\)), アボガドロ定数 (\(N_A\)), 光速 (\(c\)), 円周率 (\(\pi\)) といった物理定数や、角度変換、特定の関数 (Gaussian, Lorentzian) が提供されています。

    • ただし、Launcher.py 自体はこれらの定数や関数を直接計算に利用していません。これらは、ランチャーによって起動される可能性のある他の科学計算スクリプトのために、グローバルスコープで利用できるようにインポートされています。

数学的・物理的な計算は本プログラムの主機能ではありません。本プログラムは、定義された設定とユーザーインタラクションに基づいて、外部プロセスを管理・実行することに特化しています。

必要な非標準ライブラリとインストール方法

Launcher.py が動作するために必要な主な非標準ライブラリは以下の通りです。

  1. numpy

    • 目的: 数値計算機能を提供しますが、Launcher.py 自体は直接利用せず、関連ライブラリの tklib.tksci を通じて一部の関数がインポートされています。

    • インストール方法:

      pip install numpy
      
  2. tklib

    • 目的: Launcher.py のGUI、設定管理、スクリプト実行などの中心的な機能を提供するカスタムライブラリ群です。tkimport, tkutils, tkparams, tkfile, tkgui.tkapplication_gui, tkgui.tktkinter, tkscript_macro, tksci.tksci, tkgui.tktooltip など、多数のモジュールを含みます。

    • インストール方法: このライブラリは pip でインストールされる標準的なパッケージではありません。Launcher.py と同じプロジェクト構造内(通常は tkProg_Root ディレクトリ以下)に配置されていることを前提としています。Launcher.py は、自身のパスまたは環境変数 tklibPath をもとに tklib/python ディレクトリを sys.path に追加することでこれをロードします。

  3. tkLauncherApp

    • 目的: tklib.tkgui.tkapplication_gui.tkApplication_GUI を継承し、Launcher.py の固有の機能(ランチャーメニューの初期化、スクリプトの登録など)を実装するアプリケーションクラスです。

    • インストール方法: このモジュールは通常、Launcher.py と同じディレクトリ、または sys.path が通っている場所に配置されるカスタムモジュールです。pip でインストールされるものではありません。

tkinter はPythonの標準ライブラリの一部であるため、別途インストールする必要はありません。

必要な入力ファイル

Launcher.py は、その設定と動作を制御するために以下の種類のファイルを必要とします。

  1. アプリケーション設定ファイル (.ini 形式)

    • ファイル名: Launcher.ini (デフォルト。ユーザー環境や設定により異なる場合があります)

    • 期待されるデータ構造:

      • [Configure] セクション: アプリケーションの全体設定(例: lang, geometry, editor_path, python3_path, confirm_on_exit, debug など)。

      • その他、tkLauncherApp が管理するさまざまな設定パラメータ。

    • 目的: アプリケーションの動作に必要なパス、外部ツールの設定、GUIのレイアウト、デバッグ設定などを永続化します。

  2. スクリプトリストファイル (.list 形式)

    • ファイル名: default.list またはコマンドライン引数 -s で指定されたファイル名(例: my_scripts.list)。

    • 期待されるデータ構造:

      • [extra_scripts] セクション: ランチャーに追加するスクリプトへの相対パスまたは絶対パスを1行に1つ記述。

      • [remove_scripts] セクション: ランチャーから除外するスクリプトのファイル本体名(拡張子含む)を1行に1つ記述。

    • 目的: ランチャーに表示するメインメニューの項目となるスクリプト (.ini ファイル) のリストを定義します。

  3. ランチャースクリプト定義ファイル (.ini 形式)

    • 配置場所: app.launcher_script_dir (通常は Launcher.pyscripts/ サブディレクトリ)

    • ファイル名: 任意の名前 (.ini 拡張子)。例: File.ini, Tool.ini, MyScript.ini。これらのファイル名がGUIのメインメニュー項目として表示されます(app.p() でローカライズされる可能性あり)。

    • 期待されるデータ構造:

      • [MenuName] セクション: メインメニュー項目名。

      • [SectionName] セクション(例: [MenuName].1, [MenuName].2, [TButton1], [RButton1] など):

        • caption: GUIに表示されるボタンのテキスト。

        • command: 実行するシェルコマンドまたはPythonスクリプト。

        • task: 実行するタスクの種類(例: help, dblclick)。

        • idx: ボタンのインデックス。

    • 目的: 各メニュー項目やボタンがクリックされたときに実行される具体的なコマンド、その表示名、関連する動作を定義します。

  4. リソースファイル (.resource 形式)

    • ファイル名: resource_en.resource, resource_ja.resource など(言語コードを含む)。

    • 期待されるデータ構造: キー = の形式で、GUIに表示されるフレーズの多言語定義。

    • 目的: アプリケーションのUIを多言語化するためのテキスト辞書を提供します。

  5. アイコンファイル (.ico 形式)

    • ファイル名: tkProg.ico (デフォルト。パスは tkprog_X_path 環境変数または相対パスで指定)

    • 目的: アプリケーションのウィンドウアイコンとして使用されます。Windows OSでのみ適用されます。

生成される出力ファイル

Launcher.py は、その実行中に以下の種類のファイルを生成または更新します。

  1. アプリケーション設定ファイル (.ini 形式)

    • ファイル名: Launcher.ini (またはユーザー指定のパス)

    • 内容: アプリケーション終了時、現在のGUIの状態(ウィンドウサイズ、位置など)や、ユーザーがGUI上で変更した設定(外部アプリケーションのパス、言語設定など)がこのファイルに保存されます。これにより、次回の起動時に前回の設定が復元されます。

    • 生成タイミング: アプリケーションの終了時。

  2. ログファイル (.txt 形式)

    • ファイル名: Launcher-out.txt (またはユーザーディレクトリ内のパス: ~/Launcher-out.txt, AppData/Local/launcher/Launcher-out.txt など)

    • 内容: プログラムの標準出力 (stdout) やエラー出力 (stderr) がこのファイルにリダイレクトされて記録されます。初期化プロセス、設定の読み込み、スクリプト実行時のメッセージ、警告、エラーなどが含まれます。

    • 生成タイミング: アプリケーションの起動時(ファイルが存在しない場合)に作成され、実行中に追記されます。

  3. パラメータファイル (.prm 形式)

    • ファイル名: infile に対応する .prm ファイル(例: data.csv が入力ファイルの場合、data.prm

    • 内容: 特定の入力ファイルに関連付けられたパラメータが保存される可能性があります。これは、main 関数内で tkvars.get("prmpath", None) が設定されている場合にのみ発生します。

    • 生成タイミング: アプリケーション終了時に、infile に対応するパラメータファイルが設定されている場合に保存されます。

コマンドラインでの使用例 (Usage)

Launcher.py の基本的なコマンドラインでの使用方法は以下の通りです。

(i)   usage: python Launcher.py [-s=script_list_name]
         ex: python Launcher.py -s={script_list_name}
  • python Launcher.py: 引数なしで実行した場合、デフォルトの設定ファイルとスクリプトリスト (default.list など) を使用してランチャーを起動します。

  • -s=script_list_name: ランチャーが読み込むスクリプトリストファイルを指定します。script_list_name には、スクリプトリストのファイル名(例: my_scripts.list)を指定します。パスが指定されない場合、launcher_script_dir/../config/Launcher/ または launcher_script_dir/ から検索されます。

コマンドラインでの具体的な使用例

例1: デフォルトのスクリプトリストを使用して起動する

この例では、特別な引数なしで Launcher.py を実行します。これにより、プログラムはデフォルトのスクリプトリストファイル(通常は default.list)と設定ファイル Launcher.ini を使用して起動します。

コマンド:

python Launcher.py

実行結果の説明:

  • Launcher.py のメインGUIウィンドウが起動します。

  • ウィンドウタイトルには Launcher のバージョン情報が表示されます(例: Launcher [1, 4, 0])。

  • コンソールには、初期化メッセージ、設定ファイルの読み込み状況、環境変数の設定、ログファイルのパスなどが表示されます。

  • GUIの左側には、default.list で定義されたメインメニュー項目(例: File, Tool, Help など)が表示されます。

  • ツールバーには "Setup"、"Exit" ボタンと、設定されたTButtonが表示されます。

  • ログファイル (Launcher-out.txt) が作成または更新され、実行に関する詳細情報が記録されます。

  • ユーザーはGUIを操作して、定義済みのアプリケーションやスクリプトを起動できます。

例2: 特定のスクリプトリストファイルを指定して起動する

この例では、my_custom.list という名前のカスタムスクリプトリストファイルを使用して Launcher.py を起動します。このファイルには、通常の default.list とは異なる、または追加のスクリプト定義が含まれていると仮定します。

コマンド:

python Launcher.py -s=my_custom.list

実行結果の説明:

  • Launcher.py のメインGUIウィンドウが起動します。

  • コンソール出力に Read script lists from [...]my_custom.list のようなメッセージが表示され、指定されたスクリプトリストが読み込まれたことが示されます。

  • GUIのメインメニューには、my_custom.list およびそれによって参照される .ini ファイルに定義されたメニュー項目が表示されます。default.list の内容とは異なる、またはそれに加えて、my_custom.list に特有の項目が表示されるでしょう。

  • それ以外の動作(ログファイルの生成、設定の保存など)は、引数なしの場合と同様に行われます。

  • この機能により、用途やプロジェクトに応じて異なるランチャー設定を簡単に切り替えることができます。