入力データを基にSINカーブをグラフで出力してみます。基本構成は「入力画面」「演算」「出力画面」「イベントボタン」で「演算」+「出力画面」は関数としてまとめてみます。
初めてのPythonなのでどういう書き方がいいかよくわかりません。
ネットで色々なソースをコピーしながら変更しながら書いてみました。そのため意味を十分理解しない書き方もありそう。
先ず、最初にライブラリの宣言をします。
import matplotlib.pyplot as plt #グラフ作画
import tkinter as tk #GUI
import numpy as np #数学
入力画面の概要を「tkinter」を使って作画します。
root = tk.Tk()
root.geometry('400x150')
root.title('SIN wave')
次に、入力画面のデザインをして初期値を設定します。ソースコードから作成するテキストボックスは多くなると書くのが面倒くさいですね。
#「データ入力画面」作画
sample0 = tk.Label(text='[1周期(sin)のサンプル数] [sin波形数]')
sample0.place(x=10, y=10)
sample1 = tk.Entry(width=15)
sample1.place(x=30, y=40)
sample2 = tk.Entry(width=15)
sample2.place(x=155, y=40)
sample1.insert(0,32) #初期値
sample2.insert(0,8) #初期値
ここからメインの処理ですが、関数として宣言して処理を行います。テキストボックスから取得したデータは型変換して数値に直します。
#SIN波形作成関数
def getdata(event):
f1 = int(sample1.get())
num = int(sample2.get())
Snum = f1*num # 全サンプル数
#サンプル番号
SP = [] #リスト宣言
for i in range(Snum):
SP.append(i)
SINカーブは「numpy」を利用して計算しますが、ここでは従来のようにSINカーブを描く方法からPython?らしい書き方まで3種類で計算してみます。Python の場合、配列はリストと呼ばれているようです。
#SIN波形作成 1
MP = [] #リスト宣言
for i in range(Snum):
T0 = i/f1
MP.append(np.sin(2*np.pi*T0))
#SIN波形作成 2
a_MP = [0]*Snum #リスト宣言と初期化(all zero)
for i in range(Snum):
T0 = i/f1
a_MP[i] = np.sin(2*np.pi*T0)
#SIN波形作成 3
x = np.arange(0,Snum,1)
y = np.sin(2*np.pi*x/f1)
グラフは「matplotlib.pyplot」を使って3種類を縦に並べて表示するようにしました。1種類だけなら「plt.sbuplot()」を省略すればOKのようです。
#「グラフ」作画
plt.clf()
plt.subplot(3,1,1)
plt.plot(SP,MP,label = "SIN-1")
plt.legend(loc = "upper right")
plt.subplot(3,1,2)
plt.plot(SP,a_MP,label = "SIN-2")
plt.legend(loc = "upper right")
plt.subplot(3,1,3)
plt.plot(x,y,label = "SIN-3")
plt.legend(loc = "upper right")
plt.show()
ここではボタンを表示して、クリックされるとテキストボックスの数値を取り込んで関数を呼び出しています。
#「ボタン」作画
button1 = tk.Button(text='OK', width=30)
button1.place(x=30, y=100)
button1.bind('<Button-1>',getdata)
root.mainloop()
この書き方で、常にボタンで入力待ち状態になり、何度でもSINカーブを書き直せます。ブラフ出力に自動で添付されるボタン類はまだ、使い方がよくわかりません(笑)
このプログラムで入出力画面の書き方、データの取り込み方、関数の宣言の仕方等、Python の基本的な書き方が理解できたような気がします。