バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
tkinterによるGUI作成の際のウィジットであるScaleの配置と挙動確認ができたところ。
ウィジットの配置としては完了だが、
これだけではまた完成とは言えない。
後は、以下が残っている。
- タイマ処理
- 描画関連処理
- FMU関連処理
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
まずどこから手を付けるか?

とりあえず、
- タイマ処理
- 描画関連処理
- FMU関連処理
がのこってるわけだけど、
まずはタイマ処理かな?

そうだね。
タイマが使えないことにはFMU関連処理、描画関連処理の実装箇所がないからね。

言われてみればそうだね。

で、そのタイマ処理はどうすれば実現できるの?
tkinterのタイマ処理

タイマ処理自体はそれほど難しくはない。
root.mainloop()
の前に以下を実行すればOKだ。
root.after(1000, Timer_handler)

afterってメソッドを使うってことんだろうけど、
それぞれの引数は?

第1引数がタイマ処理起動までの時間。
単位はms。
今回の場合だと1000msで1秒だね。

第2引数がタイマハンドラ。
Timer_handler
って関数を事前に定義しておき、
それを渡すことでタイマ処理起動時に該当関数がコールバックされる。

とりあえず、テストコードを書くとこんな感じかな?
cnt = 0
def Timer_handler():
global cnt
cnt+=1
print(cnt)
root.after(1000, Timer_handler)
root.mainloop()

ほう。
自らやろうとするのは感心だな。

試しに実行してみたら?

じゃ、とりあえず起動。
実行結果
1

あれ?
ほんとは1秒ごとに1,2,3・・・みたいな感じで増えていくことを想定したけど、最初の1だけで止まってる・・・。

afterメソッドは1回コールバックしたら2回目はコールバックしないんだよねー。

えー?!
じゃーどうすれば繰り返し読んでくれるのー?!!

タイマハンドラの中で再度afterメソッドを呼び出せばOKだ。

なるほど。
以下にすればいいんだな。
cnt = 0
def Timer_handler():
global cnt
cnt+=1
print(cnt)
root.after(1000, Timer_handler)
root.after(1000, Timer_handler)
root.mainloop()

早速実行。
実行結果
1
2
3
4
5
6

うん。
期待通り1秒おきにインクリメントした数値が表示されてる。

というわけでtkinterによるタイマ処理は以上だ。

出来てしまえば大したことでは無いのだねー。
まとめ

まとめだよ。
- まずはtkinterのタイマ処理から確認。
- タイマ処理に描画処理、FMU処理を組み込むためまずはタイマ。
- タイマ処理はafterメソッドに指定時間とタイマハンドラを渡すことで実施できる。
- しかし、一回コールバックするとそれで終了。
- よって、周期的に処理したい場合はタイマハンドラ内で再度afterメソッドを呼び出す必要あり。
バックナンバーはこちら。
コメント