バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はtkinterのタイマ処理について確認した。
できてしまえば、それほど難しい実装ではなかった。
残りは以下。
- 描画関連処理
- 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処理が居ないから何を描画したら良いのか・・・。
まぁダミーのデータを表示すればいいんじゃないかな?
そっか。
適当なsin波とか出してみればいいのか。
タイマハンドラ内で描画処理
とりあえず、以下のコードを追加してみよう。
def plot_handler():
if pausebln.get() == False:
times = np.linspace(time.perf_counter()-8, time.perf_counter(), 800)
ax.lines[0].set_data( times, np.sin(times) )
ax.relim() # recompute the data limits
ax.set_xlim(times[0],times[-1])
canvas.draw()
root.after(200, plot_handler)
plot_handler()
root.mainloop()
前回と同じくタイマ処理をしているようだけど・・・。
afterメソッドを呼ばずにタイマハンドラを直接呼んでるけど、これっていいの?
まぁタイマ処理が走る前も描画するし、
結果的にその中でもafterメソッドは呼んでいるので、
今回の構成としてはOKだ。
なるほど。
あとは、現時刻を取得して、
そこから8秒前から現在までを800等分した等差数列を時間軸にして、
その時間軸をinputとしてsin波を作ってるのか。
canvas.draw()で実際の描画をしているんだろうけど、
ax.relim()ってなんだ?
初めて見た気がする。
描画データのリミットを自動調整してくれるmatplotlibのメソッドだね。
あー、なるほど。
自動調整してくれるのは有難い。
チェックボックスの判定
そういえば、if文でなんか判定してるよね?
これはなんだっけ?
チェックボックスの状態判定だねー。
あ、そっか。
そういえば、puaseを指示するチェックボックスを配置してたね。
ここで判定して、チェックが無ければ実行、チェックがあればスキップってことなのか。
折角だからチェックボックスが機能していることも確認しておきたかったんで入れておいた。
まとめ
まとめだよ。
- タイマ処理にmatplotlibの描画更新処理を入れてみる。
- 現時刻をベースに過去8秒分の時間軸を生成し、それをsin関数に入れてsin波生成。
- relimメソッドを使うと縦軸が自動調整される。
- pauseのチェックボックスを設置していたので、チェック状態を確認して更新するかしないかの判定に使う。
バックナンバーはこちら。
コメント