こんにちは!
最近Githubを使うことが増えてきて、Githubの草が荒れ地から草原へと移行しつつあるryo1107です!
ずっと、こっちで記事を書いてきたのですが、いい加減Qiitaでも書こうかなと思って書き出しました。
さて、今回は以前から作ろっかなーって考えていた、pythonのtkinterを使ってGUI的にグラフ表示とかちょっとした波形処理とかテーブル表示とか、CSVのロード&保存機能を持ったパネルを作成してみました。
まだ、一部機能ないけどね...
tkinterまだあんましわかってないから、コード汚いけどね.......
グラフを複数ウィンドウで開けないんだけどね......
......泣きそう( ;∀;)
ちなみに、タイトルにあるIgorっていうのは、波形のグラフや表の表示、解析とかに特化したRみたいなやつ。一応C言語ベースらしいけどめっちゃ使いにくくて、学習コスト高くてストレスしかたまらないから、pythonでIgorの便利な部分だけ再現してやろうってなわけです。
長くなりましたが、ここからが本題
今回作ったもの
こんなウィンドウを作ってみました。
ここ↓にあるのでよかったら使ってみてください。
https://github.com/ryo1107/wave_gui.git
import os,sys
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
import numpy as np
import matplotlib.pyplot as plt
# 参照ボタンのイベント
# button1クリック時の処理
def select_clicked():
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
filepath = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
load_file.set(filepath)
data_list=[]
def load_clicked():
data_path=load_file.get()
data_name=data_path.split("/")[-1].split(".")[0]
data_list.append(data_name)
globals()[data_name]=np.loadtxt(data_path,delimiter=",")
print(globals()[data_name])
wave['values']=(data_list)
def table_clicked():
pass
def display_clicked():
print(globals()[wave_name.get()])
plt.plot(globals()[wave_name.get()])
plt.show()
def analyze_clicked():
pass
def save_csv_clicked():
save_name = filedialog.asksaveasfilename(initialdir = "./",title = "Save as",filetypes = [("CSV file","*.csv")])
save_name = save_name.split(".")[0]+".csv"
if save_name==".csv":
print("Input file_name")
pass
else:
print (f"Save:{save_name}")
np.savetxt(save_name,globals()[wave_name.get()])
#コンボボックスを押した時の反応用関数
def select_wave(event):
print(wave_name.get())
def analyze_wave(event):
print(analyze_name.get())
if __name__ == "__main__":
# mainの作成
main = tk.Tk()
main.title('Main')
# main.geometry("1000x1000")
main.resizable(False, False)
# Frame1の作成
frame1 = tk.Frame(main,borderwidth = 10)
frame1.grid()
# Frame2の作成
frame2 = tk.Frame(main,borderwidth = 10)
frame2.grid(row=1,sticky=tk.E)
# Frame3の作成
frame3 = tk.Frame(main,borderwidth = 10)
frame3.grid(row=2)
# Frame4の作成
frame4 = tk.Frame(main,borderwidth = 10)
frame4.grid(row=3)
# ラベルの作成
# 「ファイル」ラベルの作成
s = tk.StringVar()
s.set('ファイル>>')
label1 = ttk.Label(frame1, textvariable=s)
label1.grid(row=0, column=0)
# 参照ボタンの作成
select_button = ttk.Button(frame1, text=u'参照', command=select_clicked)
select_button.grid(row=0, column=3)
# 参照ファイルパス表示ラベルの作成
load_file = tk.StringVar()
load_file_entry = ttk.Entry(frame1, textvariable=load_file, width=70)
load_file_entry.grid(row=0, column=2)
# Cancelボタンの作成
quit_button = ttk.Button(frame2, text='Quit', command=quit)
# quit_button.grid(row=1, column=3)
quit_button.pack(side=tk.RIGHT)
# Loadボタンの作成
load_button = ttk.Button(frame2, text='Load', command=load_clicked)
# load_button.grid(row=1, column=2)
load_button.pack(side=tk.RIGHT)
# Tableボタンの作成
table_button = ttk.Button(frame4, text='Table', command=table_clicked)
table_button.pack(side=tk.LEFT)
# Displayボタンの作成
display_button = ttk.Button(frame4, text='Display', command=display_clicked)
display_button.pack(side=tk.LEFT)
# analyzeボタンの作成
analyze_button = ttk.Button(frame4, text='Analyze', command=analyze_clicked)
analyze_button.pack(side=tk.LEFT)
# save_csvボタンの作成
save_csv_button = ttk.Button(frame4, text='Save_CSV', command=save_csv_clicked)
save_csv_button.pack(side=tk.LEFT)
# ラベルの作成
# 「wave」ラベルの作成
wave_s = tk.StringVar()
wave_s.set('wave>>')
wave_label = ttk.Label(frame3, textvariable=wave_s)
wave_label.grid(row=0, column=0)
#コンボボックス
wave_name = tk.StringVar()
wave = ttk.Combobox(frame3, textvariable=wave_name)
wave.bind('<<ComboboxSelected>>' , select_wave)
wave.grid(row=0, column=1)
wave.grid_configure(padx=5, pady=5)
# ラベルの作成
# 「analyze」ラベルの作成
analyze_s = tk.StringVar()
analyze_s.set('analyze>>')
analyze_label = ttk.Label(frame3, textvariable=analyze_s)
analyze_label.grid(row=0, column=3)
#コンボボックス
analyze_name = tk.StringVar()
analyze = ttk.Combobox(frame3, textvariable=analyze_name)
analyze.bind('<<ComboboxSelected>>' , analyze_wave)
analyze.grid(row=0, column=4)
analyze.grid_configure(padx=5, pady=5)
main.mainloop()
GUIでCSVファイルをロードして、波形処理をしよう!っていう目的で作ったものです。
現状、analyzeの選択ボックスとボタン(Table,Analyze)以外は動くようになっています。
一応使い方は以下の様になっています。
使い方
1.ターミナルで実行
$ python wave_gui.py
2.するとウィンドウが出てくるので、参照ボタンをクリックし、LoadしたいCSVファイルを選択し、Loadボタンをクリックする。
3.Wave選択ボックスにCSVのファイル名の選択肢が追加されるので、選択をし、一番下の段のボタンをクリックする。
最後に
今後どんどん機能追加をしていきますが、いかんせん不慣れなもので、GUIでの表の表示や、グラフを複数ウィンドウで表示する方法など、アドバイス等ありましたら、コメントして頂けると非常に助かります。
また、いいねをして頂けますと、今後の記事化へのモチベーションに繋がります。
面白いと思った方や、読まれた方、いいねを頂けると嬉しいです!
追記2019/10/9
macだとOSが落ちるのなんで...?