【★★★★★　Launcher.py 2023 マニュアル　★★★★★】


【★はじめに】
　Launcher.pyは簡単なバッチ処理が可能なプログラムランチャーです。

【★注意】
★本プログラムの使用に当たっては、作者は一切の責任を負いません。

【★設定ファイル】
　python GUIプログラムでは、[tkProg]\ini ディレクトリィがある場合、
その下にアカウント別の設定ファイルを作ります。


【★スクリプトファイルの追加】
　Launcher.pyでは、拡張子 .ini のスクリプトファイルをLauncherメニュー／ボタンに登録し、
実行することができます。
（１）　新しいスクリプトファイルを追加したり、あるいは削除する場合は、[Launcher]/scriptsに
　　　拡張子.iniのスクリプトファイルを追加します。
（２）　スクリプトファイルは、ファイル名を文字列としてソートした順番で読み込まれます
（３）　スクリプトファいるの構造は以下の通りです


【★スクリプトファイルの構成】
　スクリプトファイルの構成は、見た目よりも単純です。

　Launcher.pyを起動すると、左上にメニューのListBoxが表示されます。
Launcherは起動時に、スクリプトファイルの、[ButtonXX.xxxxx]というセクションを検索し、
xxxxxをリストボックスに表示します。

　Launcherのウィンドウ画面では、下半分に15個(初期値)のボタンがあります。このボタンは、
左上から右上まで、Button1...Button3、左下から右下までButton13...Button15という
名前がついています。

　リストボックスで、たとえばCIFが選択されている場合にButton1をクリックすると、
スクリプトの[Button1.CIF]セクションの内容が実行されます。
同様に、Button4をクリックすると、[Button4.CIF]が実行されます。

　[Boot]セクションは特別セクションです。
Launcherが起動し、メインウインドウを表示した直後に実行されます。
　　（複数のスクリプトファイルに[Boot]セクションがある場合、すべて実行されます）


【★セクションの書式】
	[DBLClick.CIF]
	Caption=CIF			;ボタンのキャプションの設定
	$(eitor_path) $(agument)	;コマンドスクリプト
	．．．．．			;　．．．．．．．
	End				;スクリプトの終了

	[DBLClick.CIF].help
	messge_dialog 使い方を切召します	:コマンドスクリプト
	End					;スクリプトの終了

・ Captionには、ボタンに表示させる文字列を指定します。
・ ].helpのあるセクションは、小さい '?' ボタンで実行されます。
　 ボタンにはCaptionは表示されないので、Caption行は不要です。
・ スクリプトには、任意のコマンドを書けます。
　上の例では、[Boot]セクションでeditor_path環境変数に設定したエディターを、
　引数エディットコントロールにある文字列 $(agument) を引数にして起動しています。
　最後のEndが無いと、次のセクションを継続して実行します。スクリプトを
・ 終了する時には、必ずEndをつけてください。
・行末に\がある場合、継続行として扱われます


【★以下の変数、コマンドが使えるようになっています】
【変数】
	$(var)  スクリプト変数 var の内容を展開する。	

コマンドスクリプト中のファイル名は以下の変数で取得できます。
	$p	Launcher.exeのフルパス名
	$i	Launcher.iniのフルパス名
	$s	Launcher.exeのあるドライブ名を含むディレクトリィ名
	$w	Windowsのドライブ名を含むディレクトリィ名

	$0 - $999　Launcherに与えられた引数を指定。
		$0はLauncherのプログラム自身。$1からが、実引数。
		$1以降は、Argsエディットコントロールの部分文字列である。
	$a	$1-$999までの引数を空白で区切って与える。
		Argsエディットコントロールの全文字列に等しい。

(未実装)　$e	$eがコマンド列中にあると、$eを引数各々に対して$eを置き換え、
		引数の数だけコマンドを実行する。例えば、argsに"a b"がある時、
			notepad $e
		とすると、notepad a　と notepad b を実行する。
		$eは一つのコマンド中に一つしか書かないでください。	

	$(tkProgRoot)		[tkProg]
	$(tklib_Root)		[tkProg]/tklib
	$(pythonlib_path)	[tkProg]/tklib/python
	$(perllib_path)		[tkProg]/tklib/Perl/lib
	$(tkprog_path)		[tkProg]/tkprog。tkprog_X_pathにないpython/perlプログラム
	$(tkprog_X_path)	[tkProg]/tkprog_COEなど
	$(tkapp_path)		[tkProg]/tkapp。神谷自作プログラム等
	$(tkapp_open_path)	[tkProg]/tkapp_open。VESTAなどを使う場合にtkappをコピーする必要があります
	$(tkapp_etc_path)	[tkProg]/tkapp_etc。研究以外のアプリ
	$(script_dir)		Launcher.pyのあるディレクトリィ

	$(internal_editor_path)	設定ダイアログで指定したエディタ。初期値は自動検索されます
	$(python_path)		python/python3のパス。PATH環境変数から自動検索されます
	$(perl_path)		python/python3のパス。PATH環境変数から自動検索されます
	以下は[Boot]で定義されています
	$(script_drive)		pythonスクリプトのあるドライブ名
	$(script_dir)		pythonスクリプトのあるディレクトリィ名
	$(Group)		$(tkprog_X_path)のXの部分。どのグループに配布されたプログラム化を区別する
	$(tkdb_path)		データベースディレクトリィ

ファイル名以外
	$n	改行。メッセージなどを複数行にする時に使う。

	$o	Fileエディットコントロールの全文字列。
		Fileエディットコントロールには、get_open_fileNameコマンドなどを
		使って取得したファイル名が入る。
	$(argument)	引数エディットコントロールの全文字列。

	環境変数に設定されている変数

【ファイル操作コマンド】
get_cur_dir var
	varに現在のディレクトリィパスを入れます
chdir, cd directory
	Linuxのchdirと同じです。
mkdir, md directory
	Linuxのmkdirと同じです。
rmdir, remove directory
	Linuxのrmdirと同じです。
copy source destination
	Linuxのcpと同じです。ただし、source, destinationには
	１つのファイルしか指定できませんし、ワイルドカードも使えません。
delete, del file
	Linuxのdelと同じです。ただし、fileには１つのファイルしか指定できませんし、
	ワイルドカードも使えません。

未実装　CopyIfExist source destination
	sourceが存在するときにのみ、Copy source destinationを実行します。
未実装　CopyIfNotExist source destination
	destinationが存在しないときにのみ、Copy source destinationを実行します。


【変数関連コマンド】
rem Comment
;Comment
:Comment
#Comment
	コメント行

get_cur_menu var
get_cur_menu_file var
get_cur_button_caption var
get_cur_button_idx var

set Env=Value
	DOSのsetと同じです。この効果はLauncher.exeを終了するまで、Launcher.exeから
	起動したプログラムのみに有効です。
set_if_blank var Env=Value
	varが未定義か空白の場合、EnvにValueをセットします。
set_if_null var Env=Value
	varが空白の場合、EnvにValueをセットします。

split_str str_val sep idx var_name
	文字列 str_val を sep で区切り、変数 var_name に設定します

split_str  : 0 l0

add_path newpath
	$(path)にnewpathが存在しないときのみ、
		set path=newpath;$(path) 
	を実行します。

input Env_Var Message
	インプットダイアログを表示して、環境変数Env_Varにその内容を設定します。
	インプットダイアログにはMessageが表示されます。
	また、Env_Varが既に存在する時は、インプットダイアログ表示時に、Env_Varの
	内容が表示されます。これを防ぐには、Inputの前に、set Env_Var=を実行して
	下さい。

select_dialog var title message str1 str2 ...
	リストボックスダイアログを表示して、str1以降の選択肢から選んだ文字列を変数 var に返します。
	文字列の #以降はコメントとして削除されます。
	デフォルト値はvarの値と、str1以降のコメントを削除した文字列とのマッチングで選ばれます

color_dialog var
	色選択ダイアログを表示し、変数varに設定します。

font_dialog var
	フォント選択ダイアログを表示し、変数varに設定します。

new_dialog
	新しいダイアログの定義を開始します

custom_dialog title buttons
	add_dialogで定義したダイアログを表示します。titleはダイアログタイトル
	buttonsでダイアログ株のボタンを指定できる。ok cancel yes no close。okとyes、cancelとnoは、textを除いて同じ。
	closeはokとcancelの両方の機能 (ENTERを押してokで閉じる、ESCを押してcancelで閉じる)


add_dialog widget_type var_name options
	ダイアログにウィジェットを追加します。使えるウィジェットは以下の通り
	widget_typeは下記のウィジェットの種類。
	var_nameは入力を設定する変数名。変数=値 の形で、クォートする場合は全体を "" でくくることに注意
	変数にはsetやset_if_nullなどで初期値を設定する必要があります。
	optionsには、メインウィジェットへの引数を与えられます

	# デバッグ用のダミー
	add_dialog dummy label2 "a=1" "b=1.33" "c=i am here"
	変数名は使わないのでdummyなどにしておく

	# タブで選択できるページ (notebook) を追加する	
	add_dialog tab dummy "text=title"
	変数名は使わないのでdummyなどにしておく
	これ以降の add_dialog はこのページに対して行われる
	text=でタブの名前 (ページ名) を指定する

	# notebookを解除します
	add_dialog reset_tab dummy
	変数名は使わないのでdummyなどにしておく
	これ以降の add_dialog は共通ページに対して行われる

	# 文字列を表示
	add_dialog label dummy "text=アルゴリズム:"
	変数名は使わないのでdummyなどにしておく

	# メッセージ枠内にメッセージを表示
	add_dialog message dummy "text=長い文章など"
	変数名は使わないのでdummyなどにしておく

	# １行文字列
	add_dialog entry entry1 "label_head=head_entry" "text=entry" width=30 "label_tail=end_entry"

	# 複数行文字列
	add_dialog text  text1  "label_head=head_text" "text=text def" width=50 height=2  "label_tail=end_text"

	# ボタン。複数のボタンを横に並べる
	# frameを作らないと、前のframeの右にボタンが配置される
	add_dialog frame dummy
	add_dialog button dummy "text=run" "command=call [Execute_scikit-regressions]"
	add_dialog pack_frame dummy

	# ファイル選択
	add_dialog choose_file\
		python3_path\			# 変数名
		"label_head=python3:"\		# 先頭の文字列
		entry_width=50\			# ファイル名エントリーの幅
		"def_val=$(python3_path)"\	# ファイル名初期値
		initialdir=.\			# ファイル円卓ダイアログの初期ディレクトリィ
		"file_type=Exec:*.exe"\		# ファイルマスク
		"label_tail="			# 終端の文字列

	# ディレクトィ選択
	add_dialog choose_dir\
		script\
		"label_head=script:"\
		entry_width=50\
		"def_val=$(script)"\
		initialdir=.\
		"label_tail="

	# リストボックス
	add_dialog listbox\
		method\
		width=50\
		height=5\
		relief=groove\
		"def_val=$(method)"\
		"values=a##b"\			# リストを ## で区切って渡すこともできる
		"linear #線形回帰"\		# =の無い項目が選択肢になります。vlauesが指定されている場合はvaluesの後に追加されます
		"ridge  #Ridge回帰"\
		"label_tail="
	
	# ラジオボタン
	add_dialog radiobutton\
		method1\
		"def_val=$(method1)"\
		"values=a##b"\			# リストを ## で区切って渡すこともできる
		"linear #線形回帰"\		# =の無い項目が選択肢になります。vlauesが指定されている場合はvaluesの後に追加されます
		"ridge  #Ridge回帰"\
		"lasso  #LASSO回帰"\
		"label_tail="

	# コンボボックス
	add_dialog combobox\
		method\
		width=30\
		height=5\
		"label_head=cbs"\
		"values=a##b"\			# リストを ## で区切って渡すこともできる
		"linear #線形回帰"\		# =の無い項目が選択肢になります。vlauesが指定されている場合はvaluesの後に追加されます
		"gpr    #ガウス過程回帰"\
		"rfr    #ランダムフォレスト回帰"\
		"label_tail=cbe"

	# スピンボックス
	add_dialog spinbox \
		frac_test\
		var_type=double\
		"label_head=frac_test:"\
		entry_width=10\
		"def_val=$(frac_test)"\
		from=0.0\			# スピンボタンを押したときの数値の最小値
		to=1.0\				# スピンボタンを押したときの数値の最大値
		increment=0.1\			# スピンボタンを押したときの増加量
		"label_tail=  検証データの割合"

	# チェックボックス
	add_dialog checkbox \
		plot\
		"label_head="\
		"def_val=$(plot)"\
		"label_tail="


remove_comment var
	変数のvarから、#以前の空白と#以降の文字全てを削除し、varに代入します

read_ini_all Ini_FileName Var
	iniファイルIniFileName中の変数をVar変数に読み込みます。
	各変数はiniファイル中のkeyを使って Var.key に読み込まれます

print_all ret
	ret.key変数を表示します

read_ini Ini_FileName Section Key Var  [DefVal]
	iniファイルIniFileName中のSectionセクションのKeyキーの値を読み込み、
	変数Varに代入します。Keyに値が設定されていない場合、DefValを設定します。
write_ini Ini_FileName Section Key String
	iniファイルIniFileName中のSectionセクションのKeyキーに
	Stringを書き込みます。

read_labels path Var
	pathから.xlsxファイルを読み込み、1行目のラベルを ## で区切った文字列を
	変数 Var に設定します。
	## で区切ったリストは、add_dialog list のvaluesに設定できます

del_quote Env_Var String
	Stringの両端のクォーテーション(",')を削除します。

未実装　DecomposeParameters Str
	Strの中身を空白文字で区切り、さらにそれらを
		key==val
	の文字列とみなし、環境変数keyにvalを設定する。
	　=がない場合はファイル名とみなし、
		ArgFile番号 (番号は1から始まる連番)
	という環境変数にその文字列を設定する。
未実装　GetHeader FileName HeaderName Len Env_String
	FileNameというメールファイル中の、HeaderNameというヘッダーの内容を、最大Len文字数まで、
	環境変数Env_Stringに設定する。HeaderNameは例えば、"From:"、"Subject:"など。最後の':'は
	なくても良い。Lenは1-128の値で、これを外れる時は128に設定される。

【Launcherシステム関連コマンド】
set_title Title_String
	LauncherのウィンドウキャプションをTitle_Stringに変更する。
echo message
	コンソールにmessageを表示します
show_message message
	Launcherメッセージテキストボックスにmessageを表示する。

load_menu
	iniファイルを読み込みなおし、リストボックスのメニュー、ボタンを
	最新のものに更新します。
未実装　UpdateCaption
	Captionに$(Env_String)などを使った場合、環境変数の変更をボタンの
	キャプションに反映させる。
未実装　ClearErrorMessage
	LauncherError環境変数に空白文字列""を代入します。
未実装　OnError Command
	エラーが起こったとき、Commandを実行します。
	Commandには
		continue	何もせず、スクリプトの実行を続けます
		stop		スクリプトを停止します。
		他のコマンド
	を指定できます。

【ウィンドウ関連コマンド】
show_window [Minimize/Maximize/Normal/Hide/Show/TopMost/NoTopMost]
	Launcherの表示状態を制御する。
	[Minimize/...../NoTopMost]については、以下を参照。
show_window Minimize
	Launcherをアイコン化する。
show_window Maximize
	Launcherを最大化する。
show_window Normal
	Launcherのウィンドウを元のサイズに復帰する。
show_window Hide
	Launcherのウィンドウを不可視にします。スクリプト終了時には、
	自動的にShowWindow Normalが実行されます。
show_window TopMost
	Launcherのウィンドウを再前面に固定する。
show_window NoTopMost
	ShowWindow TopMostを無効にします。

【スクリプト制御関係コマンド】
wait_process
	直前に実行した外部プログラムが実行中は次の作業に進まない。
　.exe実行ファイルはバックグラウンド実行されます。プログラムが終了するまで
次の処理に移りたくない場合はwait_processを使います。

  これら以外のコマンドはすべて、実行可能プログラムとその引数とみなされます。
　また、リダイレクションやフィルターを使うプログラムでは、バッチファイルを
作って使うか、"cmd /K "program.exe < input.txt > output.txt"と、
/Cか/Kオプションをつけて、シェルcmd.exeに実行するコマンドを渡してください。
リダイレクション、フィルターはシェルの機能ですから、
スクリプトに直接渡してもリダイレクション、フィルターは使えません

call [Section]
	[Section]セクションのスクリプトへ実行を異動する。
	例えば、[Button1.VASP]を実行する時は、
		Call Button1.VASP
	と書く。
debug [1|on|0|off]
	デバッグモードを設定します
confirm on
	これ以後にプログラムを実行する時、コマンドラインを編集するダイアログを
	表示します。
confirm off
	Confirm onを無効にします(デフォルト）

check_exist path message
	＊メニュー変更時: pathが存在しない場合、ボタンCaptionに "!!! " をつけます
	＊スクリプト実行時： pathが存在しない場合、messageをダイアログで表示し、
	　　　　　　　　　　 フォントを 赤字、取り消し線、サイズ 8 に変更します

exit_if_defined ENV
	ENV環境変数が定義されている場合はバッチ処理を中止する。
exit_if_not_defined ENV
	ENV環境変数が定義されていない場合はバッチ処理を中止する。
exit_if_exist file
	fileが存在する時はバッチ処理を中止する。
exit_if_not_exist file
	fileが存在しない時はバッチ処理を中止する。
bye
	Launcherを終了します。

message_dialog message_string
	message_stringをMessageBoxダイアログで表示します。ユーザーはOKボタンを押して
	応答します。
	　OKボタンとCancelボタンが表示されますが、Cancelを押すとスクリプトを
	中断します。

set_dialog_var widget_var str
	ウィジェット変数 widget_var のウィジェットに str を設定します

set_message message
	メッセージエントリーにmessageを表示します
set_command_line cmd
	コマンドラインエントリーにcmdを表示します
set_command_line2 cmd
	コマンドラインエントリー2にcmdを表示します

【  ●ファイル名操作関連コマンド】
use_os_path_sep path
	path中のセパレータをOS規定に修正します

get_open_file_name File_Mask InitialDirectory Caption
get_save_file_name File_Mask InitialDirectory Caption
	ダイアログのFile Openを起動しファイル名を取得します。
	File_Maskにはワイルドカードを""で囲んで指定します。
	InitialDirectoryには、OpenDialogの初期ディレクトリィを指定します。
	Captionは、オープンダイアログのキャプションです。
	File_Mask, InitialDirectory、Captionは省略可能です。
	このコマンドで取得したファイル名は、$oで参照できます。
	また、LauncherウィンドウのFileエディットコントロール中に表示されます。
get_open_dir_name InitialDirectory Caption
	コモンダイアログのFile Openを起動しディレクトリィ名を取得します。
	InitialDirectoryには、OpenDialogの初期ディレクトリィを指定します。
	Captionは、オープンダイアログのキャプションです。
	InitialDirectory、Captionは省略可能です。
	このコマンドで取得したディレクトリィ名は、$oで参照できます。
	また、LauncherウィンドウのFileエディットコントロール中に表示されます。

get_drive FileName Env_String
		ドライブ名					(c:)
get_directory_without_drive FileName Env_String
		ドライブ名					(c:)
get_directory FileName Env_String
		ディレクトリィ名				(\win3\system)
get_last_directory FileName Env_String
		最後のディレクトリィ名				(system)
get_filename FileName Env_String
		ファイル名					(b.bat)
get_ext FileName Env_String
		拡張子						(bat)
get_filebody FileName Env_String
		拡張子以外のファイル名				(b)
get_cur_dir Env_String
		カレントディレクトリィを環境変数Env_Stringに設定する。
set_selected_file string
		Fileエディットボックスに文字列Stringをセットする。
set_args string
		Argsエディットボックスに文字列Stringをセットする。


【その他】
未実装　GetAppFile Env_String FileMask Message
	　iniファイルの[Helper]セクションの、Env_String=の内容を環境変数Env_Stringに設定する。
	Env_String=キーがない場合は、ファイルオープンダイアログをファイルマスクFieMaskで
	開いて、設定するプログラムを指定する。指定されたプログラムは環境変数Env_Stringに
	設定され、[Helper]セクションのEnv_String=キーに登録される。
	　また、GetAppDir実行時に、Env_String=キーに指定されたファイルが存在しない場合も、
	プログラムを設定しなおす。
	　ヘルパーアプリを登録するのに使う。例えば、
		[Button1.Rietan]
		Caption=&RieMenu
		GetAppFile riemenu RieMenu.exe RieMenuを指定してください
		$(riemenu)
		End
	とすれば、最初の一回だけRieMenu.exeの位置を指定すれば、二回目からはiniファイルから
	RieMenu.exeのありかがわかるので、指定する必要が無くなる。

【Development tabのevalで使える変数・関数】
[tkprog_XX]\Launcher\Launcher.py で定義されているglobal変数・関数が使える

from numpy import exp, log, log10, sin, cos, tan, arcsin, arccos, arctan, sqrt
from tklib.tksci.tksci import h, h_bar, hbar, e, kB, NA, c, pi, pi2, torad, todeg, basee
from tklib.tksci.tksci import me, mp, mn, u0, e0, e2_4pie0, a0, R, F, g
from tklib.tksci.tksci import acos, asin, atan, cosh, sinh, tanh
from tklib.tksci.tksci import degcos, degsin, degtan, degacos, degasin, degatan
from tklib.tksci.tksci import eVTonm, nmToeV
from tklib.tksci.tksci import factorial, Gaussian, Lorentzian, combination, gamma
