4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-05-05

こんにちは!
最近Githubを使うことが増えてきて、Githubの草が荒れ地から草原へと移行しつつあるryo1107です!

ずっと、こっちで記事を書いてきたのですが、いい加減Qiitaでも書こうかなと思って書き出しました。

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

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

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

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

今回作ったもの

wave_gui.png

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

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が落ちるのなんで...?

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?