【PyFMI】最小構成のMBD事例 第2章 その117【リアルタイム描画⑪】

【PyFMI】最小構成のMBD事例 第2章 その117【リアルタイム描画⑪】 事例
【PyFMI】最小構成のMBD事例 第2章 その117【リアルタイム描画⑪】

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

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました