私は、これまでずっとWindowsを使用してきました。Windowsに慣れているとGUIアプリがほとんで最近ではコマンドラインを使うことってほとんどないですよね。
ですが、Pythonはコマンドラインを使用して実行することがほとんどで、覚えるのがめんどくさくて、私はちょっとコマンドライン アレルギーで、GUIがないとつらいなぁって思ってしまいます。
同じようなことが みなさんないでしょうか?
でも実は、PythonでもGUIのアプリを作成することができるんです。
しかも、Pythonなので、Windows・Linux・MacなどPythonをインストールさえすればどんな環境でも同じように使用できます。
※プログラム内で使用するライブラリやAPIによって使用できない場合はあります。
なんといってもこれがPythonの強みですよね。
ですのでちょっと紹介いたします。
GUIのアプリを作成するためには、TKinterというライブラリを使用します。
ではまず、 TKinter の導入の方法から紹介します。
TKinterは実はpythonの標準のライブラリでいつもの”pip”でダウンロードではなく↓のようにダウンロードします。
まずは、Pythonのインストーラを用意します。インストーラはインストールされているVerと同じものを使用してください。↓からインストールします。
私の環境には、3.9.7がインストールされていますので、↓をしました。
python-3.9.7-amd64.exe
じゃあインストールしていきましょう。まずは、インストーラを実行します。
すでに済みのインストール状態での実行ですので、インストール時と違った画面になります。
では「Modify」をクリックします。
続いて、表示された画面で、「td/tk and IDLE」というのにチェックをいれてNextをクリックします。
つづいて、出てきた画面で、気にせずInstallを押してください
で、次の画面では「Close」をクリックしてください。
はい。これで、TKinterの導入完了です。
では続いて、プログラミングです。
今回は簡単にボタンをクリックするとラベルの文字がインクリメントされるだけのものを作成してみます。
じゃあいつもどおりまずは、コード一式を以下に記載します。
import tkinter
from functools import partial
def main( ):
root = tkinter.Tk()
root.title(u"Test") # タイトル
root.geometry("300x100") # Windowsサイズを設定
# Label
text = tkinter.StringVar()
text.set("0")
label1 = tkinter.Label(root, textvariable = text ) # ラベル生成 初期テキストを設定
label1.pack() # 描画位置を中央 上 詰めでセット
# Button
button1 = tkinter.Button(root, text="Click") # ボタンを生成
button1.configure(width=30,height=3) # Buttonのサイズを指定
button1.place(x=40,y=30) # 描画位置を指定してセット
def bt_click( ): # ボタンクリックのコールバック関数
now_str = text.get() # 現在テキストを取得
now_int = int(now_str) + 1 # データをintに変換して、インクリメント
text.set( str(now_int) ) # 値を再セット
button1.configure(command = bt_click ) # Buttonクリック時のコールバック設定
root.mainloop() # フォームの描画開始
if __name__ == '__main__':
main()
結果は↓の通りです。Clickを押すごとに上の数字がインクリメントされていきます。
続いてはプログラムの解説ですが、解説は次ページにて記載します。
ではそれぞれを解説していきます。
まずはフォームの設定と描画です。正式名称はわかりませんが、Windowsの.netでは、フォームと呼ばれるメインのウィンドウのことです。
このフォームにかかわる部分が↓です。
root = tkinter.Tk() # インスタンスを生成
root.title(u"Test") # タイトル
root.geometry("300x100") # Windowsサイズを設定
root.mainloop() # フォームの描画開始
root にまずインスタンスを生成し、描画の際のオプションを設定します。
Title : 表示される ウィンドウ の上側の文字を設定
geometry : 画面のサイズを指定
今回は、 “300×100” ですので、幅が300で縦が100で指定しています。
他にもいろいろとオプションを設定はありますが、今回はこの2つのみです。
あとは、 root.mainloop() ですが、これで画面が表示されます。
その名の通り、無限ループしてくれ、「×」ボタンが押されるまで描画をし続けてくれます。
では続いてラベルです。
ラベルにかかわる部分は以下です。
# Label
text = tkinter.StringVar()
text.set("0")
label1 = tkinter.Label(root, textvariable = text ) # ラベル生成 初期テキストを設定
label1.pack() # 描画位置を中央 上 詰めでセット
まず、ラベルに設定する文字の設定用に、textという文字を作成しています。
それがこちら。 StringVar 型のインスタンスを生成して、文字の”0″を設定しています。
text = tkinter.StringVar()
text.set("0")
続いて、上のtextをしていてラベルを生成するのが以下です。
label1 = tkinter.Label(root, textvariable = text ) # ラベル生成 初期テキストを設定
そして、最後にlabel1.pack()で描画位置を指定して画面に登録しています。
画面への登録としては、何種類かありますが今回はpcakで登録をしています。
packの場合は以下のようなオプションがあります。デフォルトではTOPになります。
※位置は、その時の描画の状態によって変わるようですので、少し注意が必要です。
では続いてボタンの設置とコールバックの設定です
ボタンの設置とコールバックの設定部分は以下です。
# Button
button1 = tkinter.Button(root, text="Click") # ボタンを生成
button1.configure(width=30,height=3) # Buttonのサイズを指定
button1.place(x=40,y=30) # 描画位置を指定してセット
def bt_click( ): # ボタンクリックのコールバック関数
now_str = text.get() # 現在テキストを取得
now_int = int(now_str) + 1 # データをintに変換して、インクリメント
text.set( str(now_int) ) # 値を再セット
button1.configure(command = bt_click ) # Buttonクリック時のコールバック設定
一番上の↓はインスタンスを生成しています。
button1 = tkinter.Button(root, text="Click") # ボタンを生成
ここでは、ボタンのテキストを”Click”に設定しているだけです。この生成の時に、引数をふやしていけば、この後に紹介するオプションの設定も同時に行えます。
オプション設定
その他のオプションも色々ありますが、今回は二つだけです。
ボタンのサイズ指定しています。
configure関数を使って、オプションは追加します。
widthとheigthの値を設定します。
button1.configure(width=30,height=3) # Buttonのサイズを指定
続いてボタンに位置指定です。
位置の指定は、 place 関数を使って行います。
”x”と”y”に数値を入れて、描画位置を指定します。
button1.place(x=40,y=30) # 描画位置を指定してセット
あとは、コールバック関数です。
コールバック関数とは、何かユーザがアクションをした時に呼び出される関数のことです。
ここでは、ボタンがクリックされた際に、設定したコールバック関数が呼び出されます。
bt_click という関数を生成して、それをコールバックとして設定しています。
それが以下です。コールバック関数の設定は、commandという引数に登録します。
button1.configure(command = bt_click ) # Buttonクリック時のコールバック設定
ちょっと今回のコードを見て、関数の生成が変なところにあって気持ち悪いかもしれませんが、bt_click 関数の中で、 text 変数を操作したいので、こういった形としております。
これでボタンをクリックすれば、 bt_click に飛んでくれます。
※本当は引数にtextを渡して、いつも通りの関数の記載がしたかったのですが、やり方がパッとわからなかったので、こういった形になりました。ただ、こういった柔軟性?が、Pythonのいいところではないかと私は思います。
とここまで書いて気が付きましたが、おそらく text をglobalにすれば簡単にできましたね。
ただ、globalにする場合は、初期値をいれないといけないんですが、何を入れればいいのか毎度わからないです。
※型を宣言しないPython独特の悩みですね。C言語だととりあえずvoid宣言しておけば、実態かポインタかを気をつければ何とでもなりますもんね。これは、Pythonの弱みの部分ですね。
簡単にですが、PythonでGUIを使用する方法を記載してみました。
VisualStudioやQTみたいに、GUIのツールを使用してマウス操作で簡単にGUIを作っていくのは難しいですが、比較的簡単にGUIアプリも作ることができます。
私は、ログの解析ツールなんかは、テキストボックスとボタンだけを設置してPythonとtkinterの組み合わせで行ったりしています。
Pythonは、文字列を扱うのに非常に便利なので、GUIが使えればこういった場面で重宝します。
みなさんもぜひ一度ためしてみてください。
2021/12/05 追記
このTkinterのGUIを簡単に作成できるツール PAGEについて、以下にまとめましたので、興味ある方は見てみてください。
Pythonについて勉強したい人は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。