【★★★★★ Launcher.py 2023 マニュアル ★★★★★】 【★はじめに】  Launcher.pyは簡単なバッチ処理が可能なプログラムランチャーです。 【★注意】 ★本プログラムの使用に当たっては、作者は一切の責任を負いません。 【★設定ファイル】  python GUIプログラムでは、[tkProg]\ini ディレクトリィがある場合、 その下にアカウント別の設定ファイルを作ります。 【★スクリプトファイルの追加】  Launcher.pyでは、拡張子 .ini のスクリプトファイルをLauncherメニュー/ボタンに登録し、 実行することができます。 (1) 新しいスクリプトファイルを追加したり、あるいは削除する場合は、[Launcher]/scriptsに    拡張子.iniのスクリプトファイルを追加します。 (2) スクリプトファイルは、ファイル名を文字列としてソートした順番で読み込まれます (3) スクリプトファいるの構造は以下の通りです 【★スクリプトファイルの構成】  スクリプトファイルの構成は、見た目よりも単純です。  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には 1つのファイルしか指定できませんし、ワイルドカードも使えません。 delete, del file Linuxのdelと同じです。ただし、fileには1つのファイルしか指定できませんし、 ワイルドカードも使えません。 未実装 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などにしておく # 1行文字列 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