数年前からAIブームが来ており、その度にPythonの名前を聞くことや興味を持つ方が増えたのではないでしょうか
「プログラミングに興味を持ったはいいけど、何からやればいいかわからない。」
「一人でプログラム書けるようになるのか不安」
など、さまざまなことを思うかと思います。
私は情報工学の高校出身ですが、現在は病院で働いています。
プログラムなど一切触らない業務です。
高校時代にプログラミングで挫折をして、進路変更をしました。
なので、プログラムを学び始めた人が挫折するところもなんとなくわかる気がします。
もう二度と触れることはないと思っていたプログラミングですが、病院業務にPythonを使えば、業務改善できるのではないかなぁ、と思い始めてPythonを使い始めました。
今回の記事では、Pytrhon初心者が独学でアプリ作成するまでの流れを説明していきたいと思います。
よくつまづきそうな部分、僕がつまづいた部分などは強調してお伝えしていければいいかなと思います。
実際にPythonを独学で学んで5桁の収益を出した方法はこちらから

Pythonの独学を行う前の前提

Pythonに関して取り扱っているwebサイトは無数にあります
今回、私が作成したアプリは全てwebサイトの情報をもとに独学で作成をしました
webサイトが無数にあるにも関わらず、「あっちをみたり、こっちをみたり」
とさまざまなwebサイトを見るハメになっていました
万人が理解できる解説はないと思いますが、サイト検索にめちゃくちゃ時間かけてるんで、どうしてそんなに時間をかけなくてはいけなくなったのか?
どうすれば一つのwebサイトだけで完結することができるのか?
っていうことに重きを置いて、このブログを立ち上げました
ぜひ!Python独学の参考にしてみてください!!
Pythonを使ってアプリを作る

今回作成するアプリはデスクトップアプリと呼ばれるものです。
デスクトップアプリとはパソコン上で利用することができるアプリケーションのこと。
作ろうと思ったきっかけは、業務改善のためです。
電子カルテからcsvデータを引っ張ってくると余計な情報も一緒に読み込んでしまうので、好きな列だけを好きなように抽出したいと思って作り始めました。
電子カルテから情報を引っ張ってくるのは僕だけではなく、全スタッフが行なっているので、実用的な機能になれば業務改善につながるかな、と思っています。
これ、csvデータで毎回コピペしてるとかなり時間かかるんですよ。
それですげーめんどくさかったので、作ることを決心しました。
最終目標は、簡単に操作ができる統計ソフトと全自動のスケジュールソフトを作ることです。
まずはPythonの環境構築から

ソフトを作るといっても、Pythonの環境がなければ作成することができません
Pythonの環境構築に関しては、こちらの記事を参考にしながら進めていってもらえれば、Pythonを始めることができます


GUIで操作できるように

デスクトップアプリはGUIで作成していきます(表現が正しいかはわかりません笑)
GUIはグラフィカルユーザーインターフェースの略で、マウスなどを使って操作する、ごく一般的なアプリです。
GUIでアプリを作れるプログラミング言語も限られているかと思います。
ので、Pythonを選択しました。
GUIアプリを作れるプログラミング言語についてはこちらから

本当はR言語使ってプログラム作ったんですけど、アプリ化できなかったので、Pythonに切り替えました。
PythonでGUIアプリを作る方法

PythonでGUIアプリを作る方法は簡単です。
Pythonに用意されているtkinterというモジュールを使えば作ることができます。
モジュールについて詳しい解説はこちらから

ここからは実際のコードも踏まえて説明をしていきたいと思います。
Pythonで作成したGUIソフトのコード

Pythonで実際に作成したコードをもとに解説をしていきたいと思います。
このコードでは、好きなcsvファイルを選択し、列名をリストボックスに表示させることができるプログラムです。
実際にはここからさらに発展させていきたいのですが、現状はここで一旦止めています。
なぜなら、この記事を書いている時に、壁にぶち当たっているからです。
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import os
root=tk.Tk()
root.title("チョイス")
frame=tk.Frame()
frame.grid(row=0,sticky="we")
frame_button=tk.Frame()
frame_button.grid(row=1,sticky="we")
def btn_click():
type = [("all file","*")]
path = os.getcwd ()
file_path = filedialog.askopenfilename(filetypes = type, initialdir = path)
df = pd.read_csv(file_path, engine="python")
df_columns=df.columns.values
list_value=tk.StringVar()
list_value.set(df_columns)
listbox=tk.Listbox(frame,height=30,listvariable=list_value,selectmode="single")
listbox.pack()
Button=tk.Button(frame_button,text="選択",command=btn_click)
Button.grid(row=1,column=0)
root.mainloop()
Tkinterのインストール

Pythonでtkinterを使えるようにしなくてはいけません
使えるようにする方法は以下の通り
Import tkinter
Import 〇〇
の〇〇にはモジュール名がきます
このモジュール名を変更すればさまざまなものをインストールすることができます
さらに、import 〇〇 as ××
と入力すれば〇〇のことを××と呼びます、と宣言することができます。
例えば、
Import tkinter as tk
と入力すればtkinterをtkと呼んで利用することができるようになります。
なんでそんなことをするかというと、プログラムを打っていく中で、何度も「tkinter」と入力する場面が出てきます。
何度も何度も「tkinter」って入力するのはめんどくさいので、短くて楽なものにしようっていうことです。

これでひとまずtkinterを使うことができるようになりました。
tkinterはGUIアプリを作るために必要最低限の下準備みたいなものです。
ここから様々な機能を付け加えていきます。
TkinterでGUIのメイン画面を表示させる

tkinterをインポートすることができたら、今度はGUIアプリのメイン画面を表示させていきます。
Import tikinter as tk
root=tk.Tk()
root.mainloop()
これでメイン画面を表示させることができます。

上記のような画面が表示されれば、成功です。
root=tk.TK()
というのはルートウィンドウを作るためのコマンドです
このルートウィンドウにさまざまな機能を持ったボタンを配置していくことになります。
また、プログラムの中でルートウィンドウは一つだけとされています。
実際に実行したことはないですが、二つ以上作ろうとするとエラーになるのではないでしょうか?
rootの部分はなんでも好きな文字を入れることができます。
main=tk.TK()
でも問題ありません。
小文字のtkの部分は、
Import tkinter as tk
のtkです
Import tkinter
にしている場合は、
root=tkinter.Tk()
になります。
次に
root=mainloop()
は立ち上げたウィンドウを開きっぱなしにしておくためのコマンドです。
ここがないと、立ち上がった直後にウィンドウが消えます。
最後に、
Import tikinter as tk
root=tk.Tk()
root.mainloop()
ここのrootはどちらも同じ名前にしておかないといけません
例えば、
Import tikinter as tk
root=tk.Tk()
main.mainloop()
や
Import tikinter as tk
main=tk.Tk()
root.mainloop()
などではエラーになりますので、注意しておきましょう。
Tkinterで立ち上げたウィンドウにタイトルをつける

rootウィンドウを立ち上げると上側にタイトルが表示されます。
ここは任意で変更することができますので、以下のように打ってみましょう
import tkinter as tk
root=tk.Tk()
root.title("Hello World")
root.mainloop()
これでプログラムを実行すると、立ち上がったウィンドウの上側に「Hellow World」が表示されているはずです。
僕のコード例は以下のようになっています。
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import os
root=tk.Tk()
root.title("チョイス")


今回はチョイスというタイトル名にしています。
csvから好きな列だけを選択するので、そういった名前にしています。
タイトルと機能に関係を持たせておけば、ぱっと見でなんのソフトなのかがわかると思います。
tkinterで立ち上げたウィンドウにフレームをつける

最初に作成したメインウィンドウには以下のようなパーツを配置することができます
以下のようなパーツのことをウィジェットと呼びます。
- Label
- Button
- Entry
- Checkbutton
- Scale
- Frame
などなど
そして、この個々のウィジェットを複数組み合わせて使用するために必要なのが、Frameと呼ばれるウィジェットになります。
Frameの詳しい使い方はこちらを参考にしてください。

TkinterではFrameを絶対に使わなくてはいけない。
ということはありません。
なくても作成することができますが、GUIの自由度が増すので、使えるのであれば使った方かいいと思います。


今回の僕のコードでは、
frame=tk.Frame()
frame.grid(row=0,sticky="we")
frame_button=tk.Frame()
frame_button.grid(row=1,sticky="we")
の部分となっています。
以下のコードを記載すれば、実際に画像のような画面が表示されるようになるはずです
#ウインド画面の作成
root=tk.Tk()
root.title("チョイス")
root.geometry("600x600")
#フレームの作成
#フレーム1(上側:リストボックスを格納する)
frame=tk.Frame()
frame.grid(row=0)
frame2=tk.Frame()
frame2.grid(row=0,column=1)
#フレーム2(下側:ボタンを格納する)
frame_button=tk.Frame()
frame_button.grid(row=1,columns=1)
frame_button1=tk.Frame()
frame_button1.grid(row=2,columns=1)
frame_button2=tk.Frame()
frame_button2.grid(row=2,columns=1)
#リストボックスの作成
list_value=None
list_value1=None
listbox=tk.Listbox(frame,height=30,listvariable=list_value,selectmode="single")
listbox1=tk.Listbox(frame2,height=30,listvariable=list_value1,selectmode="single")
listboxData = {}
#ボタンの作成
Button=tk.Button(frame_button,text="ボタン")
Button.grid(row=1,column=1)
Button1=tk.Button(frame_button1,text="ボタン")
Button1.grid(row=2,column=1)
#画面の表示
listbox.pack()
listbox1.pack()
root.mainloop()

frame=tk.Frame()
でフレームを作成することができます
frame=tk.Frame(xxx,yyy)
xxxと書いた部位には第一引数、yyyyと書いた部分には第二引数を入力することができます
第一引数にはメインウィンドウを指定します。今回の場合であれば、rootということになります。
メインウィンドウ・フレーム・ウィジェットの関係性は以下のようになっています

また第二引数以降はオプションを指定することができます。
引数はなくてもプログラムは実行するので、必要があれば入力すればOKです。
引数についての詳しい解説は以下を参考にしてみてください。

第二引数以降に利用することができるオプションは以下のものがあります
オプション | 値 | 説明 |
width | int | フレームの横幅 |
height | int | フレームの縦幅 |
relief | flat(デフォルト),raised
sunken,groove,ridge |
フレームの枠を指定 |
bg or background | color | フレームの背景色 |
bd or borderwidth | int | ボーダーの幅 |
cursor | マウスポインタの種類 | マウスポインタの見た目を指定 |
pady | int | 枠とテキストとの間の縦の空白 |
padx | int | 枠とテキストとの間の横の空白 |
takefocus | True, False | Tabキーでのフォーカス移動の有無 |
>>>PythonのFrameで使えるオプション一覧(…coming soon…)
tkinterのpack/grid/placeについて

さて、Frameの次行にあるのが、
frame.grid(row=0,sticky="we")
になります
これはフレームの位置を決めるためのものです
フレームの配置には3種類の方法があります
- pack
- grid
- place
それぞれ一つずつ解説をしていきます
Packについて
Packを使用することで、作成したウィジェットを一列に並べて配置することができます。
Frameと同じようにオプションを使用することで、配置位置などを変更することができます
オプション | 値 | 説明 |
anchor= | E, W, S, N, NE, SE, NW, SW, CENTER | widgetの寄せ方向を決める。default=CENTER |
expand= | 0, 1 | ジオメトリマスタの余分なスペースを埋めるために拡大する(1)かしない(0(default))かを決める。 |
fill= | NONE, X, Y, BOTH | widgetの空きスペースを埋める方向を決める。default=NONE |
padx= | int値 | widget外側、横方向の隙間を指定。default=0 |
pady= | int値 | widget外側、縦方向の隙間を指定。default=0 |
ipadx= | int値 | widget内側、横方向の隙間を指定。default=0 |
ipady= | int値 | widget内側、縦方向の隙間を指定。default=0 |
side= | TOP, LEFT, RIGHT, BOTTOM | widgetを詰める方向を決める。default=TOP |
Gridについて
Gridはウィジェットの配置を行(row)と列(column)で指定することができます
Gridもpack同様にオプションをつけることが可能です
オプション |
値 |
説明 |
row= |
int値 |
行位置を決める。 |
column= |
int値 |
列位置を決める。 |
rowspan= |
int値 |
繋げる行数を指定する。default=1 |
columnspan= |
int値 |
繋げる列数を指定する。default=1 |
padx= |
int値 |
widget外側、横方向の隙間を指定。default=0 |
pady= |
int値 |
widget外側、縦方向の隙間を指定。default=0 |
ipadx= |
int値 |
widget内側、横方向の隙間を指定。default=0 |
ipady= |
int値 |
widget内側、縦方向の隙間を指定。default=0 |
sticky= |
E, W, S, N, NE, SE, NW, SW, CENTER |
packのanchor+fill機能。配置の寄せ方向を決め、複数指定(W + E等)で引き伸ばすことができる。 |
placeについて
最後がplaceについてです
Placeではx座標、y座標を指定することで、ウィジェットの位置を決めることができます
メインウィンドウの左上端が(0,0)になります
Placeにもオプションはあります
属性 |
説明 |
anchor |
pack と同じ、デフォルトは Tk.NW |
bordermode |
縁を内側 (Tk.INSIDE) か外側(Tk.OUTSIDE)につける。デフォルトは Tk.INSIDE |
height |
高さを pixel で指定。 |
relheight |
親 widget に対する相対的な高さを 0.0 — 1.0 の実数で指定。 |
relwidth |
親 widget に対する相対的な幅を 0.0 — 1.0 の実数で指定。 |
relx |
親 widget に対する相対的な横の位置を 0.0 — 1.0 の実数で指定。デフォルトは 0 |
rely |
親 widget に対する相対的な横の位置を 0.0 — 1.0 の実数で指定。デフォルトは 0 |
width |
幅を pixel で指定。 |
x |
横の位置を pixel で指定。デフォルトは 0 |
y |
縦の位置を pixel で指定。デフォルトは 0 |
より詳しいウィジェットの配置に関しては以下の記事を参考にしてください
>>>tkinterのウィジェットの配置について。(pack/grid/place)実例付き

最後はframe_buttonについてです
frame_button=tk.Frame()
frame_button.grid(row=1,sticky="we")
tkinterでボタンがクリックされた時の応答
ここからはGUI上でボタンがクリックされた時の応答について解説していきたいと思います
実際のコードはこちら
def btn_click():
type = [("all file","*")]
path = os.getcwd ()
file_path = filedialog.askopenfilename(filetypes = type, initialdir = path)
df = pd.read_csv(file_path, engine="python")
df_columns=df.columns.values
print(df_columns)
list_value=tk.StringVar()
list_value.set(df_columns)
listbox=tk.Listbox(frame,height=30,listvariable=list_value,selectmode="single")
listbox.pack()
btn_click
というアクションが生じた時に、それ以下の動作をさせるコードになっています
ここの一連のコードはボタンを押したときに、パソコンのファイル選択画面に移行して、好きなファイルを選択、csvファイルを読み込み、csvファイルの列名をリストボックスと呼ばれるウィジェットに反映させる、という流れになっています
先頭のdefとはdefinitionの略です
definitionとは定義という意味です
btn_clickを定義しますよ、ということです。こういうのを「関数を定義する」と言います。
覚えておくと後々の学習が楽になると思います。
type = [("all file","*")]
で全ての拡張子ファイルを洗濯することができるようにしています
csvのみ、pdfのみとかにもすることができます
path = os.getcwd ()
ここはカレントディレクトリを取得するコードです
カレントディレクトリに関する詳しい内容は、以下の記事を参考にしてください
>>>Pythonでカレントディレクトリを確認・変更する方法(…coming soon…)

file_path = filedialog.askopenfilename(filetypes = type, initialdir = path)
filedialogはtkinterのオブジェクトです
これを使うことで、GUI画面上で見慣れたファイル選択画面を作成することができます
ここで出てきているfiletypes = typeの「type」はその前に定義したものになっています。


ざっくりと僕が今作ろうとしている、統計ソフトのコードを解説しました。
ところどころにリンクを貼っているので、詳しく知りたい方はそちらを参考にしていただけると幸いです。
Python学習でつまづかないためには?

Python学習を進めていく上で、
「ひとまず何かしらの書籍に目を通したい」
「webで調べても全くわからない」
という状況が何度も何度でも出てくるかと思います。
そういう時に便利なのが、kindleとテラテイルです。
Kindleはご存知の通り、電子書籍です。
Kindleには多くのPython学習本が用意されており、無料で読むことができます。(たまに有料もあります)
ひとまずどういった書籍があるのか?
もしものために、書籍に目を通しておこう
という場合には、kindleの利用がおすすめです。
また、webで調べて、試行錯誤しても全くわからない…
っていう状況を打破してくれる、手助けしてくれるのが、テラテイルです。
実現したいこと・エラーメッセージ・コードなどを記載すれば、プロのエンジニアの方々が手助けをしてくれます。
どちらも登録しておいて損はないサイトです。
Python初心者はぜひ利用してみてください。