- Pythonでデスクトップアプリを作成したいと思っている
- GUIを作るのが初めてのため、Tkinterをひとまず触ってみた
- Tkinterとは?…Pythonの標準ライブラリ。手軽にGUIを作成できる
- 基本的な動かし方を確認するためのサンプルコードを作成
サンプルコード
import tkinter as tk
# window・ウィジェット作成
def create_window():
root = tk.Tk()
root.title("Tkinter Sample")
# ラベルの作成と配置
label = tk.Label(root, text="Hello, Tkinter!")
label.pack(pady=10)
# ボタンの作成と配置
# ラムダを使ってon_button_clickにラベルを渡す
button = tk.Button(root, text="Click Me", command=lambda: on_button_click(label))
button.pack(pady=10)
return root
# ボタンクリック時の動作
def on_button_click(label):
label.config(text="Button clicked!")
# メインループ開始(ユーザー入力待機状態)
def start_main_loop(root):
root.mainloop()
if __name__ == "__main__":
# window・ウィジェット作成
root = create_window()
# メインループ開始(ユーザー入力待機状態)
start_main_loop(root)
コード解説
コードの構成
- windowとウィジェット(今回はボタン)を作成(create_window)
- windowの作成
- ボタンの作成・配置
- クリック時の動作を設定(on_botton_click)
- メインループ開始(ユーザー入力待機) (start_main_loop)
windowとウィジェットを作成(create_window)
- ウィンドウの生成→root
- この後作成する、ラベルやボタンは
root
に紐づけて作る
- ウィンドウラベルの生成・配置(pack)
- ボタンの生成・配置(pack)
- tk.Botton(【ウィンドウオブジェクトの変数(今回はroot)】, text=【ボタンの表示テキスト】, command==【クリック時の動作】)
- 今回はクリック時の動作を関数で定義・ラムダ式で渡している(後述)
何故ラムダ式で渡すのか(コールバックに引数を渡すための遅延実行の仕組み)
- 今回はボタンクリック時の動作を別の独立した関数に書きたかった
- そのため、クリック時に表示が変わるラベル(label)を引数で渡す必要があった
- ラムダ式ではない、
command = on_botton_click(label)
で渡すと、コードを読み込んだ時点で渡してしまう
→ ウィンドウ表示の最初からボタンクリック後の挙動になる(意図しない挙動)
- ラムダ式であらかじめ動きだけ定義することで、メインループ時に呼び出されて、意図した動作になる
- ラムダ式じゃない別の方法だと、
- ラッパー関数(関数の中のサブ関数)を使用する
- 別のライブラリを使用する
などでも同じこと(関数で定義した挙動に引数を渡すこと)が可能
クリック時の動作を設定(on_botton_click)
メインループ開始(ユーザー入力待機) (start_main_loop)
- ユーザーの入力待機状態にする
- このコードでウィンドウが表示されるイメージ
- ↑の理解は厳密には間違い。ただ、最初はこの理解でも良さそう?
まとめ
- GUIを作成する一歩目として、Tkinterのサンプルコードを作成・動作確認をした
- 手軽に作成できるため、初めてのGUIでは良いと思った
- 手軽さとトレードオフで、作れるものに制限があったりすると思うので、今後作成するアプリはひとまずTkinterで実装して、必要に応じて別のものを使用したい
コメント