アプリ実行プラグラム本体について
前回までの作成画面。
コードを全部載せると長くなるので、layout による画面デザイン部分の後に続くパートのみとする。
window = SG.Window('Widget 演習中', layout,size=(600,400)) # ウィンドウのタイトルとサイズを設定
while True: # ウィンドウを表示し続ける
event, values = window.read() #event 変数にイベント発生要素を検知し values で値参照
print(event, values) # コードウィンドウに入力値を列挙させる
if event == SG.WIN_CLOSED or event == '閉じる':
break
if event == '実行':
# テキストボックスに結果表示
window['姓名'].update(values['姓']+values['名'])
if values["回答拒否"]: #チェックボックスを確認
X=SG.popup_ok_cancel("回答拒否になっていますが、どうして ?",title="入力チェック") #メッセージボックス表示
SG.popup(X+"ですね、わかりました ( ´ー`)",title="最終確認")
window.close()
While True : 無限ループ処理
ユーザーの操作を待ち続けるウィンドウは 公式サイトでは”永続ウィンドウ”と称されている。前回書かなかった処理をすべてメモしておこう。
event, values = window.read() は、ウィンドウ描画をしてイベントを監視する(たぶん)定型文。
event も values も window.read() の1行目のコードで定義されたウィンドウ描画関数(?)の実行時にイベント動作結果を取得する組込変数で、名前のとおり、event にはイベント発生エレメント、values にはすべてのキーと値が代入される。ひとつの関数で複数の変数に代入するという、見慣れないと戸惑うが、後の処理を考えると合理的だと理解できる。
print(event, values) はプラグラム実行には関係しないが、イベント発生時にVSCode(エディタ)のデバッグウィンドウに変数値を表示してくれる。
“閉じるボタン”を押された時には、イベント発生エレメント{ キー : 値, ・・・}の形式で列挙される。
閉じる {'姓': '田中', '名': '健一', '男性': True, '女性': False, '性別不明': False, '回答拒否': True}
エレメント値の確認が一行のコードで完結するというめちゃくちゃ便利機能。
後の処理はイベントプロシージャの代わりに、条件分岐文を書くことになる。
if 文 : 条件分岐
サンプルではまだまだ検知すべきイベントが少ないが、エレメント(Widget)の多い画面では、エラー処理も含めてここだけで数100行にもなるのだろうなと気が重くなるが仕方ない。後に大嫌いになった古の”一括処理”を思い出した
サンプルコードでは、実行ボタンが押された場合に
if event == SG.WIN_CLOSED or event == ‘閉じる’:
break
としている。event 変数が”閉じる”なので値の取得はない。比較式の統合は == になる。SG.WIN_CLOSED はPython(PySimpleGUI?) のシステム定数であり、ウィンドウ右上のおなじみ”✕”ボタン。
or でつないで他のイベント発生元である”閉じる”を検知して、次行の break を実行してループを抜け、ウィンドウ画面を閉じる。実行部が短くて単純処理なら
サンプルではまだまだ検知すべきイベントが少ないが、エレメント(Widget)の多い画面では、エラー処理も含めてここだけで数100行にもなるのだろうなと気が重くなるが仕方ない。後に大嫌いになった古の”一括処理”を思い出した
サンプルコードでは、実行ボタンが押された場合に
if event == SG.WIN_CLOSED or event == ‘閉じる’:
break
としている。event 変数が”閉じる”なので値の取得はない。比較式の統合は == になる。SG.WIN_CLOSED はPython(PySimpleGUI?) のシステム定数であり、ウィンドウ右上のおなじみ”✕”ボタン。
or でつないで他のイベント発生元である”閉じる”を検知して、次行の break を実行してループを抜け、ウィンドウ画面を閉じる。実行部が短くて単純処理なら、コロンが条件式の終わり記号なので
if event == SG.WIN_CLOSED or event == ‘閉じる’: break でも問題ない。
if 条件式1:
条件式1が真の時に実行する文
elif 条件式2:
条件式1が偽で条件式2が真の時に実行する文
elif 条件式3:
条件式1及び条件式2が偽で条件式3が真の時に実行する文
else:
すべての条件式が偽のときに実行する文
popup : チェックボックスの値に対応してメッセージボックスを表示
エレメントの値参照は values[“キー名”]: になる。
チェックボックスがチェックされていたら、if values[“回答拒否”]: に合致してジャンプする。
メッセージボックス表示には popup 関数(?) を用いる。SG.popup(文字列) が単純なメッセージを表示する最小の書き方。ここでは、popup_ok_cancel() によって、”OK”または”Cancel”とういう文字列が返され、X 変数に代入する。
X=SG.popup_ok_cancel("回答拒否になっていますが、どうして ?",title="入力チェック")
SG.popup(X+"ですね、わかりました ( ´ー`)",title="最終確認")
実行結果は下のとおり。実際の運用では、まじめな文面にするだろう。
左のメッセージボックスでCancel ボタンが押された場合には X 変数と文字列を連結して右のようなメッセージ文になる。もちろん変数名は命名規則に外れてなければ何でもかまわない。
最初の確認メッセージボックス
Cancel ボタンを押した結果
サンプルコードではここで終わり。左のメッセージボックスでどちらを押してもメッセージボックスが消えて元の画面に戻るだけ。何か処理をしたければ If 文で分岐すれば良いだけなので省略。
ふぅ、疲れた。続きは次号にて。(;`ー´)
コメント