tkinterを使ってIgorっぽい物をpythonで作ってみた(まだ作り途中)

こんにちは！
最近Githubを使うことが増えてきて、Githubの草が荒れ地から草原へと移行しつつある[ryo1107](https://qiita.com/ryo1107)です！

ずっと、[こっち](https://hacknote.jp/archives/author/r-kato/)で記事を書いてきたのですが、いい加減Qiitaでも書こうかなと思って書き出しました。

さて、今回は以前から作ろっかなーって考えていた、pythonのtkinterを使ってGUI的にグラフ表示とかちょっとした波形処理とかテーブル表示とか、CSVのロード&保存機能を持ったパネルを作成してみました。

まだ、一部機能ないけどね...
tkinterまだあんましわかってないから、コード汚いけどね.......
グラフを複数ウィンドウで開けないんだけどね......
......泣きそう( ；∀；)

ちなみに、タイトルにあるIgorっていうのは、波形のグラフや表の表示、解析とかに特化したRみたいなやつ。一応C言語ベースらしいけどめっちゃ使いにくくて、学習コスト高くてストレスしかたまらないから、pythonでIgorの便利な部分だけ再現してやろうってなわけです。

### 長くなりましたが、ここからが本題

# 今回作ったもの

<img width="224" alt="wave_gui.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292551/510d7ddd-1e75-5626-06cf-8df99327f2fd.png">

こんなウィンドウを作ってみました。
ここ↓にあるのでよかったら使ってみてください。
https://github.com/ryo1107/wave_gui.git

```python:wave_gui.py
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が落ちるのなんで...？