前回作ったアプリに、グラフがどう変わったか履歴を表示できる機能を付ける
1. 誰に向けた記事か
・tkinterでどんなアプリが作れるのか興味がある人
・PID制御の各パラメータがどんな影響を与えるのか直感的に理解できるアプリがあったらいいなと思ってた人
2. はじめに
前回はPID制御をGUIで操作できるアプリを作りました。
これに機能を追加してきます。今回はグラフの変化の履歴を表示できる機能を作ります。
3. コード・実行結果
3.1 コード
import tkinter as tk import tkinter.ttk as ttk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import ( FigureCanvasTkAgg, NavigationToolbar2Tk) import numpy as np from control.matlab import * root = tk.Tk()#ウインドの作成 root.title("pid soft")#ウインドのタイトル root.geometry("650x350") #ウインドの大きさ frame_1 = tk.LabelFrame(root,labelanchor="nw",text="グラフ",foreground="green") frame_1.grid(rowspan=2, column=0) frame_2 = tk.LabelFrame(root,labelanchor="nw",text="パラメータ",foreground="green") frame_2.grid(row=0, column=1, sticky="nwse") frame3=tk.LabelFrame(root,text="履歴",foreground="green") frame3.grid(row=1,column=1,sticky="nwse") #スケールバーが動いたらその値を読み取りグラフを更新する def graph(*args): graph_on_off=graph_var.get() if graph_on_off==0: ax.cla() Kp=scale_var.get() Ti=scale_var_Ti.get() Td=scale_var_Td.get() value_Kp=f"{Kp:.2f}" value_Ti=f"{Ti:.2f}" value_Td=f"{Td:.2f}" text_display.set(str(value_Kp)) text_display_Ti.set(str(value_Ti)) text_display_Td.set(str(value_Td)) num=[Td,1,1/Ti] den=[1,0] G_ID=tf(num,den) G_all=feedback(G_ID*Kp*G,1) (y_s,t_s)=step(G_all,T=np.arange(0,10,0.01)) (y_in,t_in)=step(1,T=np.arange(0,10,0.01)) ax.set_xlabel('t / s') ax.set_ylabel('y') plt.style.use('ggplot') ax.plot(t_s,y_s) ax.plot(t_in,y_in,linestyle="dashed") ax.set_title('Kp='+str(value_Kp)+',Ti='+str(value_Ti)+',Td='+str(value_Td)) canvas.draw() #伝達関数の設定 #PID制御のパラメータ Kp=30 #比例ゲイン Ti=1.8 #積分ゲイン Td=0.2 #微分ゲイン num=[Td,1,1/Ti] den=[1,0] G_ID=tf(num,den) #伝達関数の設定 num = [0.1] den = [0.1, 1.0, 1] G = tf(num, den) G_all=feedback(G_ID*Kp*G,1) #ステップ応答 (y_s,t_s)=step(G_all,T=np.arange(0,10,0.01)) (y_in,t_in)=step(1,T=np.arange(0,10,0.01)) #グラフの設定 fig=plt.Figure() ax = fig.add_subplot(111) ax.plot(t_s,y_s) ax.plot(t_in,y_in,linestyle="dashed") ax.set_title('Kp='+str(Kp)+',Ti='+str(Ti)+',Td='+str(Td)) ax.set_xlabel('t / s') ax.set_ylabel('y') plt.style.use('ggplot') #tkinterのウインド上部にグラフを表示する canvas = FigureCanvasTkAgg(fig, master=frame_1) canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) #比例ゲインのスケール作成 scale_var=tk.DoubleVar() scale_var.set(Kp) scale_var.trace("w",graph) scale=ttk.Scale(frame_2,from_=0,to=10,length=150,orient="h",variable=scale_var) scale.grid(row=1,column=0) #比例ゲインのテキスト text=tk.Label(frame_2,text="比例ゲイン:Kp") text.grid(row=0,column=0) #比例ゲインの数値表示テキスト text_display=tk.StringVar() text_display.set(str(Kp)) label=tk.Label(frame_2,textvariable=text_display) label.grid(row=1,column=1) #積分ゲインのスケール作成 scale_var_Ti=tk.DoubleVar() scale_var_Ti.set(Ti) scale_var_Ti.trace("w",graph) scale_Ti=ttk.Scale(frame_2,from_=0.01,to=3,length=150,orient="h",variable=scale_var_Ti) scale_Ti.grid(row=3,column=0) #積分ゲインのテキスト text_ti=tk.Label(frame_2,text="積分ゲイン:Ti") text_ti.grid(row=2,column=0) #積分ゲインの数値表示テキスト text_display_Ti=tk.StringVar() text_display_Ti.set(str(Ti)) label_Ti=tk.Label(frame_2,textvariable=text_display_Ti) label_Ti.grid(row=3,column=1) #微分ゲインのスケール作成 scale_var_Td=tk.DoubleVar() scale_var_Td.set(Td) scale_var_Td.trace("w",graph) scale_Td=ttk.Scale(frame_2,from_=0,to=1.0,length=150,orient="h",variable=scale_var_Td) scale_Td.grid(row=5,column=0) #微分ゲインのテキスト text_td=tk.Label(frame_2,text="微分ゲイン:Td") text_td.grid(row=4,column=0) #微分ゲインの数値表示テキスト text_display_Td=tk.StringVar() text_display_Td.set(str(Td)) label_Td=tk.Label(frame_2,textvariable=text_display_Td) label_Td.grid(row=5,column=1) #グラフ変化の履歴を残すか指定できるラジオボタンを作成 graph_var=tk.IntVar() graph_var.set(0) graph_on=tk.Radiobutton(frame3,value=0,variable=graph_var,text="なし") graph_on.pack() graph_off=tk.Radiobutton(frame3,value=1,variable=graph_var,text="あり") graph_off.pack()
root.mainloop()
3.2 実行結果
実行すると以下のアプリが表示されます。
今回追加したのは右下の履歴欄です。履歴欄のありにチェックしてスケールバーを動かすとグラフの変化が表示されます。
■ 読んで良かった本を紹介
私はAmazon kindle unlimitedというサービスを1年以上利用しています。
これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。
ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。
なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。
それか30日に気になる本を全て読破すれば実質タダです。
ぜひ気になった方はチェックしてみて下さい。
なお学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。
以下に私がkindle unlimitedで読んでよかった本を紹介します。kindle unlimitedに登録すれば何回読んでも何冊読んでも月額980円だけです。
1.
tkinterでの基本的なパーツの作成方法(ボタンやテキストやスクロールバー等)について、初心者が読んでもすぐに分かるように丁寧に書かれています。私はtkinterを学んだ後に知りましたが、こんなに分かりやすい本があるなら初めからこの本を読んで勉強すればこんなに苦労するなかったのにと思ったくらいです...
2.
投資信託について「投資信託とは?」「どうやって始めるか?」「口座はどこで開設するか?」など具体的なアクションまで書かれている本です。ど素人の著者が口座や銘柄を選ぶ過程が詳しく書いてるので非常に分かりやすかったです。
3.
ジャンルは経済に入ると思いますが全然堅苦しくなく読める本です。身近な事例をもとに「成程、そういうことだったんだ」と思うような説明がされていて面白かったです。
4.
既にベストセラーになってる本なので読んだ方も多いと思います。
堀江さんは時にキツイ物言いで炎上しますが、言ってることや考えてることはすごくまともだし、それを説明する能力にも長けているので読んでいてためになりました。
5.
「どういうお金の使い方をしたら幸せを感じれるのか?」「お金持ちになったら本当に幸せになれるのか?」を大きなテーマに、様々な体験談や研究事例を通してお金の賢い使い方を紹介している本です。
6. 雑誌系
家電、美容、アウトドア、経済など様々な雑誌があります。
こういった雑誌を買っていませんか?1つでも買っているならkindle unlimitedに登録した方が安上がりで更に読み放題です。
7.

超筋トレが最強のソリューションである 筋肉が人生を変える超科学的な理由
- 作者:Testosterone,久保孝史,福島モンタ
- 出版社/メーカー: 文響社
- 発売日: 2018/04/27
- メディア: Kindle版
この本は「1. 著者の筋トレ格言」「2. 筋トレ体験談」「3. 筋トレの効能を学術論文を引用して科学的に説明」の3部からなっています。この本で私が好きな著者の考え方は、
「弱いのはメンタルではない、フィジカルだ。メンタルを鍛えたいならまずフィジカルを鍛えろ。」
です。
気になる方は過去記事を見て下さい。
4. 説明
前回同様、PID制御の説明とpythonでの書き方は以下記事をご覧ください。
今回追加した部分は、
1. 関数内のif文
2. ラジオボタン
です。
def graph(*args): graph_on_off=graph_var.get() if graph_on_off==0: ax.cla() #グラフ変化の履歴を残すか指定できるラジオボタンを作成 graph_var=tk.IntVar() graph_var.set(0) graph_on=tk.Radiobutton(frame3,value=0,variable=graph_var,text="なし") graph_on.pack() graph_off=tk.Radiobutton(frame3,value=1,variable=graph_var,text="あり") graph_off.pack()
ここでif文の中の ax.cla() はグラフを消す処理のことです。
つまりこれまでは、スライダーを動かすたびに一度グラフを消してから新しいグラフを描いていました。
そこでグラフを消す処理をif文として書き、if文の判定値としてラジオボタンのどっちがチェックされているかとしました。
つまりラジオボタンの「なし」がチェックされている場合はgraph_varの値が0なので、if文が成立し古いグラフが消去されます。
反対にラジオボタンの「あり」にチェックされている場合は graph_varの値が1なので、if文が成立せず古いグラフがそのまま残るという流れになります。
5. 最後に
個人的にラジオボタンはかなり使える機能だと思います。これまで自分が作ったアプリのほとんどで使っている気がします。
一応以下に過去記事を張っておきます、気になる方はぜひ。