株価シュミレーター（？）を作る（3）

###今回で株価シュミレータ（？）のGUI部分を紹介させて頂き、取り急ぎ・突貫工事で急遽作成した「なんちゃって株価データ生成ツール」の全3部作を終了とさせて頂きます。

##ただひたすらに・・ただ懸命に書き並べて、表示して、位置調整して・・・・・
今回は最終段階の、GUIツールの定義部分になります。基本的には定型的な書き並べを繰り返していく事になるのですが、むしろその後の微調整時間に手数を「修行の様に」多く取られる作業になるかと思います。

・・・最近、この類いの作業を多く行う機会が有り、やっぱりUIデザイナーさん達は凄い！
と感じる次第です。。。（汗）

特に難しい点は無いと思いますので、詳しい説明は割愛させて頂きます。
記述の順序は、GUIの上から順番（実際には位置調整のパラメータ合わせ作業を行い易くする意図・・丸見えですが・・・（苦笑））に並んでいます。

~~~Python
#
# メインの処理
#
# 生成するデータの個数
label1 = tk.Label(root, text = "生成するデータの数")
label1.place(x = 20, y = 20)
Gen_Count = tk.Text(root, width = 15, height = 1)
Gen_Count.place(x = 200, y = 20)
Gen_Count.insert(tk.END,"100")

# 生成する時間形式の選択
label2 = tk.Label(root, text = "データの生成時間形式")
label2.place(x = 20, y = 50)
combo_dict1 = {"LIVEモード向け": "0", "秒以下を乱数計算で出力": "1", "指定された秒単位を加算": "2", "指定された分単位を加算": "3", "指定された時間単位を加算": "4", "指定された日数単位を加算": "5"}
cb1 = ttk.Combobox(root, values = list(combo_dict1.keys()), state = "readonly")
cb1.place(x = 200, y = 50)
cb1.current(0)

# 生成調整パラメータ
label3 = tk.Label(root, text = "生成調整パラメータ")
label3.place(x = 20, y = 80)
Wait = tk.Text(root, width = 15, height = 1)
Wait.place(x = 200, y = 80)
Wait.insert(tk.END,"0.5")

# 出力先データベースの選択
label4 = tk.Label(root, text = "出力先データベースの選択")
label4.place(x = 20, y = 110)
combo_dict2 = {"SingleStore": "0", "MySQL_CDC": "1"}
cb2 = ttk.Combobox(root, values = list(combo_dict2.keys()), state = "readonly")
cb2.place(x = 200, y = 110)
cb2.current(0)

# 計算スタート時点の株価設定
label5 = tk.Label(root, text = "株価の初期値")
label5.place(x = 20, y = 160)
# 株式会社　松
Stock1 = tk.Text(root, width = 15, height = 1)
Stock1.place(x = 200, y = 160)
Stock1.insert(tk.END,"100")
# 株式会社　竹
Stock2 = tk.Text(root, width = 15, height = 1)
Stock2.place(x = 320, y = 160)
Stock2.insert(tk.END,"120")
# 株式会社　梅
Stock3 = tk.Text(root, width = 15, height = 1)
Stock3.place(x = 440, y = 160)
Stock3.insert(tk.END,"150")

# 計算スタートパラメータの設定
label6 = tk.Label(root, text = "計算パラメータ")
label6.place(x = 20, y = 185)
# 株式会社　松
Stock1_P1 = tk.Text(root, width = 15, height = 1)
Stock1_P1.place(x = 200, y = 185)
Stock1_P1.insert(tk.END,"0")
Stock1_P2 = tk.Text(root, width = 15, height = 1)
Stock1_P2.place(x = 200, y = 210)
Stock1_P2.insert(tk.END,"0.9")
# 株式会社　竹
Stock2_P1 = tk.Text(root, width = 15, height = 1)
Stock2_P1.place(x = 320, y = 185)
Stock2_P1.insert(tk.END,"0")
Stock2_P2 = tk.Text(root, width = 15, height = 1)
Stock2_P2.place(x = 320, y = 210)
Stock2_P2.insert(tk.END,"0.2")
# 株式会社　梅
Stock3_P1 = tk.Text(root, width = 15, height = 1)
Stock3_P1.place(x = 440, y = 185)
Stock3_P1.insert(tk.END,"0")
Stock3_P2 = tk.Text(root, width = 15, height = 1)
Stock3_P2.place(x = 440, y = 210)
Stock3_P2.insert(tk.END,"0.3")

# 生成過程のコンソール出力
label7 = tk.Label(root, text = "データの生成過程を出力")
label7.place(x = 20, y = 260)
checkbtn = tk.StringVar()
chk = ttk.Checkbutton(root, variable = checkbtn, text = "コンソール出力", onvalue = 1, offvalue = 0)
chk.place(x = 200, y = 260)
checkbtn.set(0)

label8 = tk.Label(root, text = "株式会社　松")
label8.place(x = 200, y = 140)

label9 = tk.Label(root, text = "株式会社　竹")
label9.place(x = 320, y = 140)

label10 = tk.Label(root, text = "株式会社　梅")
label10.place(x = 440, y = 140)

# データベース上に格納テーブルを作成
lup_button = tk.Button(root, text = "格納テーブルを初期化・作成", command = Table_Init)
lup_button.place(x = 20, y = 300)

# データベース上にTGTテーブルを作成
cdc_button = tk.Button(root, text = "TGTテーブルを初期・作成", command = TGT_Init)
cdc_button.place(x = 320, y = 300)

# 株価の計算を行ってデータベースを更新する
tgt1_button = tk.Button(root, text = "株価の計算を行いデータベースを更新する", command = Data_Gen)
tgt1_button.place(x = 20, y = 345)

# SQL処理プログレスバーの設定
label6 = tk.Label(root, text = "SQL処理状況：")
label6.place(x = 20, y = 390)
progressbar1 = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate", style="Orange.Horizontal.TProgressbar")
progressbar1.pack()
maximum_bar = 20
value_bar = 0
div_bar = 1
progressbar1.configure(maximum=maximum_bar, value=value_bar)
progressbar1.place(x = 140, y = 395)

# 終了ボタン設置
exit_button = tk.Button(root, text = "　　閉じる　　", command=Exit_Tool)
exit_button.place(x = 430, y = 430)

# ステータスバー設置 <---コードを修正
statusbar = tk.Label(root, text =  " 作業準備完了！", bd = 1, relief = tk.SUNKEN, anchor = tk.W)
statusbar.pack(side = tk.BOTTOM, fill = tk.X)

# GUIのイベントループを作成
root.mainloop() 

#
# 終了後の処理
#
print("------------------------------------------------")
print(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") + " : " + EXT_Message)
print("******************* 処理終了 *******************")
print("------------------------------------------------")
#########################################################################################
~~~

##出来上がったGUIツールを動かしてみる！
今回のGUIツールが完成したので、取り急ぎ検証環境で動作確認を行ってみます。
今回はMBP上にDocker版のSingleStoreを導入し、そのデータベース上のテーブルに100個のデータをライブモード用の時間情報を付与する条件で生成してみました。
計算に使うパラメータは初期値のままでで変更は行っていません。

![スクリーンショット 2021-11-05 8.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/b1c53443-086b-0a7c-6545-f05ab9a9d3f9.png)

プログレスバーが右側一杯に行くと、処理が終了するのでこの後に記事予定の「専用の可視化ツール」でデータの状況を確認してみます。

![スクリーンショット 2021-11-05 9.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/11d74368-2b26-f034-2d65-7d0ba7bb12c0.png)

無事に面白いデータが出来上がっている様ですね。
因みに、Equalum用にCDC側のテーブルにデータを生成し、CDCストリーミングで即時同期させたターゲット側の状況を比較表示すると

![スクリーンショット 2021-11-05 7.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/d7131d76-508b-d899-00c1-5bf1819bbf33.png)

という感じで生成されたデータと、ストリーミングされたデータの両方を、無事に可視化比較する事が出来ました。

また、このツールを使い少し連続して長めの設定を行った条件で、LogiCOMPOSERの環境と連携させたライブモードの、EqualumのCDCストリーミング検証の動画がこんな感じになります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/FhZyUOLhyp8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

左側がCDC設定されたMySQLで、このデータベース上のテーブルに向かって今回のツールがデータ挿入を行い、Equalumがその状況を即時検知して、指定されたターゲットデータベースに対して即時再現を行っている形になっています。
各データベースや可視化ツールの動作環境（CPU&メモリ）が、非常に厳しい構成（特にLogiCOMPOSERの環境）でしたので、現実的な構成ではさらに滑らかでリアルな同期状況を可視化する事が出来るかと思います。

###もちろん！この環境は、Python部分を除いて・・・・・ノーコードで出来ています！

##まとめ
3回に渡って飛び込みで入ってきた検証用のGUIツール（Python版）に関する情報を公開させて頂きました。お役に立てるか否か？は別として、何かの参考になれば幸いです。

なお、開示コードについては、NDA（ノン・ダメ出し・アグリーメント）ベースで・・・という事で宜しくお願い致します（苦笑）。

また、コアの株価計算式の参考にさせて頂いた、こちらのブログ作者様にもこの場をお借りして改めて御礼申し上げます。

https://blog.porto-folio.net/2020/02/blog-post_20.html

では、次回は専用の可視化ツールについて紹介させて頂きますので、引き続き宜しくお願い致します。

[**株価シュミレーター（？）を作る（1）**](https://qiita.com/wadaken1961/items/e0b4b4c64e6b8329354c)はこちら
[**株価シュミレーター（？）を作る（2）**](https://qiita.com/wadaken1961/items/c7c740944aeff52a1e49)はこちら
[**株価シュミレーターの計算結果確認ツール作成**](https://qiita.com/wadaken1961/items/6018366f52206234128c)はこちら