バックナンバーはこちら。
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メソッドを呼び出す必要あり。
バックナンバーはこちら。
コメント