PythonでGUIを作る①

1.はじめに

今回はpythonでGUIを作成していきたいと思います。

GUIとは、簡単に言うとマウスでクリックして操作できるものです。パソコンで操作するアプリなどはほとんどGUIです。逆にpythonなどのプログラミング言語はCUIと呼ばれ、キーボードで操作します。

PythonでGUIを作成する理由は、直感的に操作できることや他の人に作成したものを共有しやすいことです。PythonでGUIを作るには、GUIを作るライブラリを使用します。代表的なライブラリとしてTkinter、Kivy、PyQtなどがあります。使ったことがないものもあるので差がわかりませんが、今回はTkinterを使っていきます。

目標をしっかり定めていませんが、納得いくまで作っていくつもりなので何章かに分かれると思いますが、参考になれば幸いです。

2.Tkinterを使ってみる

早速Tkinterを使ってみます。TkinterはPython初期状態からあるライブラリなので、Pythonをインストールすればすぐに使えるはずです。早速枠を作ってみます。

import tkinter as tk

root = tk.Tk()
root.title("不規則波の浅水変形")
root.geometry('300x500')

root.mainloop()

このようなウィンドウが作成されるはずです。 軽くコードを解説します。

import tkinter as tk

Tkinterライブラリをインポートします。長いのでtkに省略しています。

root = tk.Tk()

ウィンドウを作成します。rootはウィンドウの名前なのでなんでも大丈夫です。

root.title("不規則波の浅水変形")

ウィンドウのタイトルを決めています。タイトルが「不規則波の浅水変形」なのは、この後、浅水係数について進め行くためです。あまり気にしないでください。

root.geometry('300x500')

ウィンドウの大きさを決めています。root.resizable(width = False, height = False)を入れるとウィンドウの大きさが固定されます。

root.mainloop()

実行コマンドです。

3.不規則波の浅水変形を計算するGUIを作ってみる

だいぶ内容が飛躍するのですが、不規則波の浅水変形を計算するアプリのようなものを作っていきます。不規則波の浅水変形の計算式については、とても長く解説できないため省略します。

不規則波の浅水変形の計算について下記の枠が必要になります。

入力

  • 換算沖波波高 Ho´(m)
  • 沖波周期 To(s)
  • 計算水深 h(m)

計算結果

  • 波形勾配 Ho´/L
  • 相対水深 h/Ho´
  • 水深波長比 h/Lo
  • 波高 H
  • 浅水係数 Ks

まずは枠組みを作っていきます。

import tkinter as tk

root = tk.Tk()
root.title("不規則波の浅水変形")
root.geometry('300x500')


label_1 = tk.Label(root,text='換算沖波波高 Ho´')
label_2 = tk.Label(root,text='m')
label_3 = tk.Label(root,text='沖波周期 To')
label_4 = tk.Label(root,text='s')
label_5 = tk.Label(root,text='計算水深 h')
label_6 = tk.Label(root,text='m')
label_7 = tk.Label(root,text='計算結果')
label_8 = tk.Label(root,text='波形勾配 Ho´/L')
label_9 = tk.Label(root,text='')
label_10 = tk.Label(root,text='相対水深 h/Ho´')
label_11 = tk.Label(root,text='')
label_12 = tk.Label(root,text='水深波長比 h/Lo')
label_13 = tk.Label(root,text='')
label_14 = tk.Label(root,text='波高 H')
label_15 = tk.Label(root,text='')
label_16 = tk.Label(root,text='浅水係数 Ks')
label_17 = tk.Label(root,text='')

Ho = tk.Entry(root, width = 5)
To = tk.Entry(root, width = 5)
hs = tk.Entry(root, width = 5)

button1 = tk.Button(root,text='計算実行',command=judgement)
button2 = tk.Button(root,text='出力',command=grafhoutput)

root.columnconfigure(0,weight=1)
root.columnconfigure(1,weight=1)
root.columnconfigure(2,weight=1)

root.rowconfigure(0,weight=1)
root.rowconfigure(1,weight=1)
root.rowconfigure(2,weight=1)
root.rowconfigure(3,weight=1)
root.rowconfigure(4,weight=1)
root.rowconfigure(5,weight=1)
root.rowconfigure(6,weight=1)
root.rowconfigure(7,weight=1)
root.rowconfigure(8,weight=1)
root.rowconfigure(9,weight=1)
root.rowconfigure(10,weight=1)

label_1.grid(column = 0, row = 0)
Ho.grid(column = 1, row = 0)
label_2.grid(column = 2, row = 0)
label_3.grid(column = 0, row = 1)
To.grid(column = 1, row = 1)
label_4.grid(column = 2, row = 1)
label_5.grid(column = 0, row = 2)
hs.grid(column = 1, row = 2)
label_6.grid(column = 2, row = 2)
button1.grid(column = 0, row = 3)
label_7.grid(column = 0, row = 4)
label_8.grid(column = 0, row = 5)
label_9.grid(column = 1, row = 5)
label_10.grid(column = 0, row = 6)
label_11.grid(column = 1, row = 6)
label_12.grid(column = 0, row = 7)
label_13.grid(column = 1, row = 7)
label_14.grid(column = 0, row = 8)
label_15.grid(column = 1, row = 8)
label_16.grid(column = 0, row = 9)
label_17.grid(column = 1, row = 9)
button2.grid(column = 0, row = 10)

root.mainloop()

上記のコードを実行することで、添付画像のようになります。一見難しそうに見えますが、ラベルやボタンを作って、設定したグリッドにおいているだけなので、意外と単純です。

ボタンに設定しているコマンドについて解説します。

button1 = tk.Button(root,text='計算実行',command=judgement)
button2 = tk.Button(root,text='出力',command=grafhoutput)

上記のボタンは「command」にボタンを押したときの処理を設定しています。今回はそれぞれ下記のようになっています。

def judgement():

#=============================
#浅水係数算出式
#=============================    
    
    label_9['text'] = format(H0/L, '.4f')
    label_11['text'] = format(h/H0, '.3f')
    label_13['text'] = format(h/L0, '.4f')
    label_15['text'] = H
    label_17['text'] = Ks
    
    graph(H0, L0, h)
def graphoutput():

#=============================
#浅水係数算出式
#=============================

    save_image(H0, L0, h)
    outputcsv()

このように設定してすることで、ボタンをクリックした際にdefで定義したコードを使用するようになっています。計算式の詳細を説明すると非常に長くなるので割愛しますが、ボタンにはdefで定義したコードが使用できるということだけ伝われば幸いです。

実際に不規則波の浅水変形の計算式を組み込んで計算するとこのようになります。

上記のように計算結果が出力されました。

4.終わりに

今回はTkinterの基礎的な使い方を説明しました。この内容を参考にすれば、最低限ですがGUIを作成できると思います。

次回以降は、グラフの作成、CSV・画像出力、CSVデータの読み込みあたりの説明ができればと思います。下の図は、入力して値をグラフにプロットしたものです。次回、解説したいと思います。

コメント