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を構築しています。プログラムの動作原理は以下の要素に基づいています。
パス解決と環境設定:
プログラム起動時、まず自身のスクリプトパス (
sys.argv[0]) を基準に、関連するライブラリ (tklib) のパスを特定します。具体的には、tklibPath環境変数が設定されていればそれを優先し、なければ相対パス../../tklib/pythonを解決してsys.pathに追加します。また、アプリケーションのルートディレクトリ (
tkProg_Root)、各種実行ファイル (bin_path)、ライブラリ (perllib_pathなど)、外部アプリケーション (tkapp_pathなど) のパスを特定し、これらを環境変数 (os.environ) に設定します。これにより、起動されるサブプロセスがこれらのパスを参照できるようになります。
設定ファイルの管理:
tklib.tkparams.tkParamsクラスを使用して、アプリケーション全体の設定を.iniファイルから読み込み、また終了時に保存します。このファイルはユーザー固有のディレクトリ(例: WindowsならAppData/Local/launcher、Linuxなら~/.launcher)に格納されます。コマンドライン引数 (
-s) や環境変数も設定パラメータとして処理されます。
GUI構築とイベント処理:
tkApplication_GUI(およびそれを継承したtkLauncherApp) を基盤として、メインウィンドウ、メニューバー、ツールバー、および複数のフレームに分割されたメインコンテンツ領域を作成します。メインメニュー: 左側のリストボックスには、
launcher_script_dir内の.iniファイルで定義されたメインメニュー項目が表示されます。サブメニュー/アクションボタン: メインメニューで項目を選択すると、その項目に関連付けられたサブメニューボタンが動的に更新されます。これらのボタンは、
tkscript_macro.tkScriptエンジンを通じて、特定のコマンドやスクリプトを実行します。イベントハンドラ: ボタンクリックやリストボックスの選択などのユーザーイベントは、対応するPython関数にバインドされ、これらの関数が
tkScriptエンジンを呼び出して外部プロセスを起動したり、UIを更新したりします。
スクリプト実行エンジン:
tklib.tkscript_macro.tkScriptは、設定ファイルで定義されたコマンドを実行するためのエンジンです。.iniファイル内の[SectionName]とその配下のキー(command,caption,taskなど)に基づいて、実行するアプリケーションのパス、引数、作業ディレクトリなどを構築し、シェルコマンドとして実行します。実行は通常、
subprocessモジュールなどのOSレベルの機能を使用して行われます。
科学定数と関数:
numpyからexp,log,sin,cosなどの基本的な数学関数がインポートされています。また、tklib.tksci.tksciからプランク定数 (\(h\), \(\hbar\)), 電気素量 (\(e\)), ボルツマン定数 (\(k_B\)), アボガドロ定数 (\(N_A\)), 光速 (\(c\)), 円周率 (\(\pi\)) といった物理定数や、角度変換、特定の関数 (Gaussian, Lorentzian) が提供されています。ただし、
Launcher.py自体はこれらの定数や関数を直接計算に利用していません。これらは、ランチャーによって起動される可能性のある他の科学計算スクリプトのために、グローバルスコープで利用できるようにインポートされています。
数学的・物理的な計算は本プログラムの主機能ではありません。本プログラムは、定義された設定とユーザーインタラクションに基づいて、外部プロセスを管理・実行することに特化しています。
必要な非標準ライブラリとインストール方法
Launcher.py が動作するために必要な主な非標準ライブラリは以下の通りです。
numpy目的: 数値計算機能を提供しますが、
Launcher.py自体は直接利用せず、関連ライブラリのtklib.tksciを通じて一部の関数がインポートされています。インストール方法:
pip install numpy
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に追加することでこれをロードします。
tkLauncherApp目的:
tklib.tkgui.tkapplication_gui.tkApplication_GUIを継承し、Launcher.pyの固有の機能(ランチャーメニューの初期化、スクリプトの登録など)を実装するアプリケーションクラスです。インストール方法: このモジュールは通常、
Launcher.pyと同じディレクトリ、またはsys.pathが通っている場所に配置されるカスタムモジュールです。pipでインストールされるものではありません。
tkinter はPythonの標準ライブラリの一部であるため、別途インストールする必要はありません。
必要な入力ファイル
Launcher.py は、その設定と動作を制御するために以下の種類のファイルを必要とします。
アプリケーション設定ファイル (
.ini形式)ファイル名:
Launcher.ini(デフォルト。ユーザー環境や設定により異なる場合があります)期待されるデータ構造:
[Configure]セクション: アプリケーションの全体設定(例:lang,geometry,editor_path,python3_path,confirm_on_exit,debugなど)。その他、
tkLauncherAppが管理するさまざまな設定パラメータ。
目的: アプリケーションの動作に必要なパス、外部ツールの設定、GUIのレイアウト、デバッグ設定などを永続化します。
スクリプトリストファイル (
.list形式)ファイル名:
default.listまたはコマンドライン引数-sで指定されたファイル名(例:my_scripts.list)。期待されるデータ構造:
[extra_scripts]セクション: ランチャーに追加するスクリプトへの相対パスまたは絶対パスを1行に1つ記述。[remove_scripts]セクション: ランチャーから除外するスクリプトのファイル本体名(拡張子含む)を1行に1つ記述。
目的: ランチャーに表示するメインメニューの項目となるスクリプト (
.iniファイル) のリストを定義します。
ランチャースクリプト定義ファイル (
.ini形式)配置場所:
app.launcher_script_dir(通常はLauncher.pyのscripts/サブディレクトリ)ファイル名: 任意の名前 (
.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: ボタンのインデックス。
目的: 各メニュー項目やボタンがクリックされたときに実行される具体的なコマンド、その表示名、関連する動作を定義します。
リソースファイル (
.resource形式)ファイル名:
resource_en.resource,resource_ja.resourceなど(言語コードを含む)。期待されるデータ構造:
キー = 値の形式で、GUIに表示されるフレーズの多言語定義。目的: アプリケーションのUIを多言語化するためのテキスト辞書を提供します。
アイコンファイル (
.ico形式)ファイル名:
tkProg.ico(デフォルト。パスはtkprog_X_path環境変数または相対パスで指定)目的: アプリケーションのウィンドウアイコンとして使用されます。Windows OSでのみ適用されます。
生成される出力ファイル
Launcher.py は、その実行中に以下の種類のファイルを生成または更新します。
アプリケーション設定ファイル (
.ini形式)ファイル名:
Launcher.ini(またはユーザー指定のパス)内容: アプリケーション終了時、現在のGUIの状態(ウィンドウサイズ、位置など)や、ユーザーがGUI上で変更した設定(外部アプリケーションのパス、言語設定など)がこのファイルに保存されます。これにより、次回の起動時に前回の設定が復元されます。
生成タイミング: アプリケーションの終了時。
ログファイル (
.txt形式)ファイル名:
Launcher-out.txt(またはユーザーディレクトリ内のパス:~/Launcher-out.txt,AppData/Local/launcher/Launcher-out.txtなど)内容: プログラムの標準出力 (
stdout) やエラー出力 (stderr) がこのファイルにリダイレクトされて記録されます。初期化プロセス、設定の読み込み、スクリプト実行時のメッセージ、警告、エラーなどが含まれます。生成タイミング: アプリケーションの起動時(ファイルが存在しない場合)に作成され、実行中に追記されます。
パラメータファイル (
.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に特有の項目が表示されるでしょう。それ以外の動作(ログファイルの生成、設定の保存など)は、引数なしの場合と同様に行われます。
この機能により、用途やプロジェクトに応じて異なるランチャー設定を簡単に切り替えることができます。