Launcher.py 技術ドキュメント

プログラムの動作

Launcher.py は、Pythonスクリプトや外部アプリケーションを統合されたグラフィカルユーザーインターフェース (GUI) から起動するための汎用ランチャーアプリケーションです。ユーザーは、複雑なコマンドライン入力なしに、事前に定義されたスクリプトやアプリケーションを簡単に選択し、実行できます。

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

  • GUIベースのランチャー: Tkinterをベースとした直感的なGUIを提供し、メインメニューとサブメニューを介してアプリケーションを起動します。

  • 設定管理: ユーザーごとの設定ファイル (Launcher.ini) を利用し、外部アプリケーションのパス、UIの表示設定、言語設定などを永続的に保存・読み込みます。

  • 動的なメニュー生成: .list 形式のスクリプトリストファイルと、各スクリプトの動作を定義する .ini ファイルを読み込むことで、メニュー項目を動的に構成します。これにより、ユーザーはプログラム本体を変更することなく、起動したいアプリケーションのリストをカスタマイズできます。

  • 外部コマンド実行: 設定されたコマンドラインを内部的にシェルで実行する機能を提供し、様々な種類のプログラムを起動できます。

  • 多言語対応: リソースファイルを通じてGUIの表示テキストの多言語化に対応しています(デフォルトで日本語と英語)。

  • ログ出力: プログラムの実行中に発生した情報や警告、エラーメッセージをログファイルに記録します。

  • 環境変数へのパス追加: 起動時に必要なライブラリやアプリケーションのパスを環境変数に追加し、サブプロセスからのアクセスを容易にします。

本プログラムは、特に開発者や研究者が頻繁に使用するツールやスクリプトを、一元化されたインターフェースから素早く実行したい場合に役立ちます。

原理

Launcher.py は、tklib というカスタムライブラリ群を基盤として構築されたTkinterアプリケーションです。

  1. GUIフレームワーク: Python標準のGUIライブラリである tkinter を、tklib.tkgui.tktkinter モジュールを介して使用します。これにより、ウィンドウ、ボタン、リストボックスなどのGUIウィジェットが作成されます。

  2. アプリケーション構造: tklib.tkgui.tkapplication_gui.tkApplication_GUI クラスを継承した tkLauncherApp クラスが、アプリケーション全体のロジックとGUI要素の管理を担います。これにより、設定のロード・セーブ、イベントハンドリング、ウィンドウのライフサイクル管理などが抽象化されています。

  3. パス解決とライブラリインポート:

    • 起動時に、環境変数 tklibPath が設定されていればそのパスを、そうでなければ Launcher.py の相対パスから tklib ディレクトリを特定し、sys.path に追加します。これは、tklib 内のモジュールをインポートするために不可欠です。

    • tklib.tkimport モジュールを使用して、tkinter などの主要なライブラリをエラーハンドリングを含めてインポートします。

  4. 設定とパラメータ管理:

    • tklib.tkparams.tkParams クラスを利用して、.ini 形式の設定ファイル(例: Launcher.ini)を読み書きします。これにより、外部アプリケーションのパス、UIのレイアウト設定、言語などのアプリケーション全体の設定が管理されます。

    • コマンドライン引数は、tkApplication_GUIadd_argument および read_args メソッドによって解析され、内部のパラメータオブジェクト (cparams) に格納されます。

  5. 動的なメニュー構築:

    • tklib.tkscript_macro.tkScript クラスが、メニューの動的生成の核となります。

    • アプリケーション起動時、まず scripts ディレクトリ内の .ini ファイルを検索します。

    • 次に、Launcher.py の実行ディレクトリやアプリケーションのグループ名に基づき、default.list[グループ名].list などのスクリプトリストファイルを読み込みます。このリストファイルは、追加するスクリプト ([extra_scripts] セクション) や除外するスクリプト ([remove_scripts] セクション) を定義します。

    • tkScript は、これらのファイルからメインメニューとサブメニューの定義(キャプション、実行コマンド、ヘルプ情報など)を解析し、GUI上に表示されるリストボックスやボタンに反映させます。

    • メニューが選択されたり、ボタンがクリックされたりすると、tkScript().execute メソッドが呼び出され、対応するコマンドが実行されます。

  6. 外部コマンド実行: tkScript().execute_external_command メソッドが、設定された外部アプリケーションやスクリプトを、指定された引数と作業ディレクトリで起動します。これにより、Pythonスクリプト、シェルスクリプト、実行可能ファイルなど、様々な種類のプログラムを統合的に管理・実行できます。

  7. 数式・物理式: numpy から exp, log, sin, cos などの基本的な数学関数、および tklib.tksci から物理定数 (h, c, e など) や科学計算関数 (Gaussian, Lorentzian など) がインポートされています。Launcher.py 自体はこれらの数式や定数を用いて直接計算を行うわけではありませんが、このランチャーが起動する 他のスクリプトやアプリケーション がこれらの科学計算モジュールを活用することを想定しており、そのための環境を提供しています。

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

Launcher.py は、以下の非標準ライブラリに依存しています。

  1. numpy: 数値計算ライブラリ。

    • インストール方法:

      pip install numpy
      
  2. tklib: Launcher.py の基盤となっているカスタムライブラリです。これは標準の pip でインストールできるパッケージではありません。

    • インストール方法: tklibLauncher.py と同じプロジェクト構造内に配置されている必要があります。具体的には、Launcher.py があるディレクトリを基準として、../../../tklib/python のような相対パスに tklib ディレクトリが存在する必要があります。 または、環境変数 tklibPathtklib/python ディレクトリへの絶対パスを設定してください。 例 (Windows):

      $env:tklibPath = "C:\path\to\tkProg\tklib\python"
      

      例 (Linux/macOS):

      export tklibPath="/path/to/tkProg/tklib/python"
      

      この設定は、Launcher.py を実行するセッションでのみ有効にするか、永続的にシステムに設定することができます。

  3. (将来的な実装のための候補)

    • tkinterdnd2: ドラッグアンドドロップ機能のためのTkinter拡張。

      • インストール方法:

        pip install TkinterDnD2
        
    • numba: Pythonコードを高速化するためのJITコンパイラ。

      • インストール方法:

        pip install numba
        

    現在の Launcher.py のコードでは、これらのライブラリはコメントアウトされており、必須ではありません。

必要な入力ファイル

Launcher.py は以下のファイルを読み込んで動作をカスタマイズします。

  1. 設定ファイル (.ini):

    • ファイル名: Launcher.ini

    • 期待されるファイル形式: INI形式。

    • データ構造: アプリケーションのグローバル設定を格納します。以下のようなセクションとキーが含まれます。

      • [Configure] セクション:

        • lang: GUIの表示言語 (en, ja など)。

        • debug: デバッグモードの有効/無効。

        • geometry: ウィンドウの初期サイズと位置 (例: "470x580" )。

        • editor_path, python3_path, perl_path, vesta_path など: 各種外部アプリケーションの実行ファイルのパス。

        • UI要素のサイズやフォント設定 (例: font_size, width_listbox)。

    • 検索パス:

      • Windows: %USERPROFILE%\Documents\launcher\Launcher.ini など。

      • Linux/macOS: $HOME/.launcher/Launcher.ini または $HOME/launcher/Launcher.ini など。

      • その他、スクリプトの相対パスにある ../../user/Launcher.iniuser/Launcher.ini も検索されます。

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

    • ファイル名: 例として default.list, my_group.list など。

    • 期待されるファイル形式: テキストファイル。

    • データ構造: GUIメニューに表示するスクリプトの一覧を定義します。

      • [extra_scripts] セクション: 追加で読み込むスクリプト定義ファイル(後述の .ini ファイル)のパスを列挙します。相対パスも指定可能です。

      • [remove_scripts] セクション: 読み込まないスクリプト定義ファイルのファイル名を列挙します。

    • 検索パス: [Launcher.pyのディレクトリ]/scripts/[グループ名].list または [Launcher.pyのディレクトリ]/../config/Launcher/[グループ名].list

    • コマンドライン指定: -s オプションでファイル名を指定できます (例: -s=my_scripts.list)。

  3. スクリプト定義ファイル (.ini):

    • ファイル名: 例として MyScript.ini, Editor.ini など。

    • 期待されるファイル形式: INI形式。

    • データ構造: 各メニュー項目に対応する具体的な動作(実行コマンド、ボタンキャプション、ヘルプメッセージなど)を定義します。

      • [メニュー名] セクション (例: [Editor], [Boot])

        • caption: メニューやボタンに表示されるテキスト。

        • command: 実行するコマンドライン文字列。$VARNAME 形式で環境変数や内部変数を参照できます。

        • task: ボタンがクリックされたときのタスクの種類 (例: help for help button)。

        • idx: メニュー内のボタンのインデックス。

    • 検索パス: [Launcher.pyのディレクトリ]/scripts/ 内。

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

    • ファイル名: resource_[言語コード].resource (例: resource_ja.resource, resource_en.resource)。

    • 期待されるファイル形式: テキストファイル。

    • データ構造: GUIの表示テキスト(ラベル、ボタンの文字など)の多言語対応のためのキーと値のペアを定義します。

    • 検索パス: [Launcher.pyのディレクトリ]/resource/ 内。

生成される出力ファイル

Launcher.py は以下のファイルを生成または更新します。

  1. ログファイル:

    • ファイル名: Launcher-out.txt

    • 内容: プログラムの実行中に標準出力 (stdout) および標準エラー出力 (stderr) に送られるメッセージが記録されます。これには、設定の読み込み状況、エラー、警告、実行されたコマンドなどが含まれます。

    • 保存場所: ユーザーの設定ファイルと同じディレクトリ ([ユーザーディレクトリ]/launcher/ など) に保存されます。書き込み権限がない場合は、現在の作業ディレクトリに生成されます。

  2. 設定ファイル:

    • ファイル名: Launcher.ini

    • 内容: プログラム終了時に、現在のアプリケーション設定(ウィンドウのサイズと位置、外部アプリケーションのパス、UI設定など、ユーザーがGUIで変更した内容を含む)がINI形式で保存されます。これにより、次回起動時に前回の状態が復元されます。

    • 保存場所: 読み込み時と同じパスに保存されます。

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

    • ファイル名: (入力ファイル名)-predict.xlsx に対応する .prm ファイル。

    • 内容: GUIで入力された特定のパラメータ(通常、アプリケーションが起動する計算スクリプトが使用するパラメータ)がINI形式で保存されます。これは、入力ファイルパスに関連付けられたパラメータを保存するための機能です。

    • 保存場所: 入力ファイルと同じディレクトリに、入力ファイルのベース名に .prm を付けた名前で保存されます。

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

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

python Launcher.py [-s=script_list_name]
  • Launcher.py: 実行するPythonスクリプトの名前です。

  • -s=script_list_name: (オプション) 使用するスクリプトリストファイルの名前を指定します。.list 拡張子を省略した場合、プログラムは自動的に補完を試みます。この引数が指定されない場合、Launcher.py はデフォルトのスクリプトリストファイル(例: default.list またはグループ名に応じたリストファイル)を検索して使用します。

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

1. デフォルトのスクリプトリストで Launcher.py を起動する

特定のスクリプトリストを指定せず、デフォルトの動作で Launcher.py を起動します。

python Launcher.py

実行結果の説明: GUIウィンドウが表示され、Launcher.py の実行ディレクトリ内の scripts ディレクトリ、または設定された config ディレクトリから読み込まれたデフォルトのスクリプトリスト (default.list など) に基づいてメニューが構成されます。アプリケーションの動作ログは Launcher-out.txt に出力され、終了時には設定が Launcher.ini に保存されます。

2. 特定のスクリプトリストファイル (my_tools.list) を使用して Launcher.py を起動する

my_tools.list という名前のスクリプトリストファイルを使用して Launcher.py を起動します。このファイルは scripts ディレクトリ内、または設定されたリストファイルの検索パス上に存在すると仮定します。

python Launcher.py -s=my_tools.list

実行結果の説明: GUIウィンドウが表示されますが、メニューの内容は my_tools.list ファイルに定義されているスクリプトによって構成されます。このファイルで指定された追加スクリプトが読み込まれ、除外スクリプトが無視されます。例えば、my_tools.list が以下の内容であるとします。

[extra_scripts]
my_script1.ini
my_script2.ini

[remove_scripts]
default_script.ini

この場合、my_script1.inimy_script2.ini で定義されたメニュー項目が追加され、default_script.ini で定義された項目は表示されません。実行ログは Launcher-out.txt に出力され、終了時には設定が Launcher.ini に保存されます。