TkinterはPythonの標準ライブラリに含まれているGUI(グラフィカルユーザーインターフェース)ツールです。
Tkinterはシンプルで使いやすく、設定画面、ファイル選択ダイアログなど
小規模なアプリケーションを作成するのに適しています。
一方で、ボタンやテキストボックスなど簡易的なウィジェットばかりで
大規模なアプリを作成することにはあまり適していないです。
しかしbindメソッドを使用すれば、Tkinterウィンドウをキーボードのキーやマウスクリック、
カーソルを操作した時に処理をトリガーとして実行することができます。
本記事では、bindメソッドを使い方を紹介します。
- Pythonでデスクトップアプリケーションを作れるようになりたい
- bindメソッドの使い方を知りたい
- Pythonで画像トリミングする方法を知りたい
bindメソッド
Pythonにおけるbindメソッドは、
ウィジェットにイベントハンドラを関連付けるために使用されます。
特定のイベントが発生した時に実行するよう定められた処理のこと。
一般的にイベントを一対一に処理を結び付けたものをハンドラ、一つのイベントに対して複数の処理を結び付けたものをリスナという。
参考:「イベントハンドラ(イベントリスナ)とは」
具体的にbindメソッドを使用すれば、ユーザーがボタンクリックやキーボード、マウスを操作した際にそれに応じた動作したり、カスタムイベントを作成してアクションを実行したりできます。
また、特定の条件が満たされたときにボタンを無効化、有効化にするような動的な制御ができます。
ユーザーインタラクション
ユーザーによる処理の例として、ボタンクリックをします。
ボタンクリックはdefで定義した処理をボタンのcommandに紐づけて実行する方法があります。
上記の記事で紹介したスクリプトを参考にして、
ボタンを押すとターミナルに「アリッシアの朝」と表示するようにしました。
#クリックしたときに実行する関数
def button_click():
print("アリッシアの朝")
#ボタンを作成
button = tkinter.Button(root, text="Click", command=button_click)
button.pack()
実行結果は以下のようになります。
bindメソッドでcommandオプションと同じ処理をするには、コードを以下のように書き換えます。
import tkinter
def button_click(event):
print("アリッシアの朝")
root = tkinter.Tk()
button = tkinter.Button(root, text="Click")
button.pack()
# ボタンがクリックされたときに関数 on_button_click を呼び出す
button.bind("<Button-1>", button_click)
root.mainloop()
実行結果は先ほどと同じで、ボタンとクリックするとウィジェットにイベントハンドラを関連付けられて文字が出力されます。
カスタムイベント
カスタムイベントは、イベント駆動型プログラミングの一部として使用されて、
特定の条件やユーザーの操作に応答するためにプログラム内で定義します。
主に、プログラムの複雑性を管理、特定のタスクやイベントを追跡に役立ちます。
先ほど、使用した<Button-1>は左クリックを意味しています。
そこにコントロールキーを押しながら左クリックをすると処理されるようにするには、コードを次のようにします。
import tkinter
def custom_event(event):
print("アリッシアの朝")
def left_click(event):
if event.state == 4: # Controlキー
root.event_generate("<<CustomEvent>>")
root = tkinter.Tk()
# カスタムイベントを定義
root.event_add("<<CustomEvent>>", "<Button-1>")
# カスタムイベントとハンドラを関連付け
root.bind("<<CustomEvent>>", custom_event)
# 左クリックイベントを監視
root.bind("<Button-1>", left_click)
root.mainloop()
left_click 関数は、左クリックイベントが発生したときに実行されるイベントハンドラです。
この関数では、Controlキーが押されている場合にのみ <> カスタムイベントを発生させるように設定します。
root.event_add(“<>”, “”) を使用して、<> というカスタムイベントを定義し、
左クリックイベント と関連付けます。
root.bind(“<>”, custom_event) により、カスタムイベントと custom_event 関数を関連付けます。つまり、カスタムイベントがトリガーされると、custom_event関数が実行します。
root.bind(“”, left_click) により、左クリックイベントとleft_click関数を関連付けます。
左クリックが発生した場合、left_click 関数が実行されます。
スクリプトを実行すると、コントロールキーを押しながら左クリックすると、文字が表示されます。
動的な制御
ボタンを押すと文字が出てきて、もう一度押すとテキストが変化します。
さらにボタンを押下すると元のテキストに戻る操作をします。
import tkinter
def toggle_text(event):
if label.cget("text") == "こんにちは":
new_text = "ありがとう"
else:
new_text = "こんにちは"
label.config(text=new_text)
root = tkinter.Tk()
label = tkinter.Label(root)
label.pack(pady=20)
button = tkinter.Button(root, text="Click")
button.pack()
# ボタンにクリックイベントとイベントハンドラを関連付け
button.bind("<Button-1>", toggle_text)
root.mainloop()
このスクリプトを実行すると、テキストが切り替わります。
UdemyでPythonを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonをインストールから環境設定、基本文法が学習
さらに暗号化、インフラ自動化、非同期処理についても学べます。
Pythonを基礎から応用まで学びたい人におすすめ
- みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2024年最新版】
機械学習ライブラリで文字認識や株価分析などを行う。
人口知能やニューラルネットワーク、機械学習を学びたい人におすすめ。
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
統計分析、機械学習の実装、ディープラーニングの実装を学習。
データサイエンティストになりたい人におすすめ。
- 0から始めるTkinterの使い方完全マスター講座〜Python×GUIの基礎・応用〜
TkinterのGUIを作成から発展的な操作までアプリ実例を示して学習。
アプリ開発したい人におすすめ。
イベント一覧
bindメソッドで使用可能なイベントは以下の通りです。
表では-1を例にしています。
-1は左クリック、-2:ホイールクリック、-3:右クリックと変更ができます。
イベント | 処理 |
<Button-1>・<1>・<ButtonPress> | マウスの左クリック |
<ButtonRelease-1> | マウスの左クリック離したとき |
<Double-1> | マウスの左をダブルクリック |
<KeyPress>、<KeyRelease> | キー入力、キー離したとき |
<KeyPress-A>、<a> | aキー入力 |
<Control> | ctrlキー入力 |
<Control-c> | ctrlキーとcキー同時入力 |
<FocusIn>、<FocusOut> | ウィジェットがフォーカスを取得したとき、失ったとき |
<Configure> | ウィジェットのサイズが変更されたとき |
<Destroy> | ウィジェットが閉じられるとき |
<Enter> | マウスカーソルがウィジェットに入ったとき |
<Leave> | マウスカーソルがウィジェットから出たとき |
<Motion> | マウスカーソルがウィジェットで動いたとき |
まとめ
Tkinterはシンプルで使いやすいですが、
簡易的なウィジェットばかりなので小規模なアプリケーションを作成するのに適しています。
しかし、bindメソッドを使用すれば、Tkinterウィンドウをキーボードのキーやマウスクリック、カーソルを操作した時に処理を実行することができます。
bindメソッドは、ウィジェットにイベントハンドラを関連付けるために使用されます。
bindメソッドを使用すれば、ユーザーインタラクション、カスタムイベント、
また特定の条件が満たされたとき実行する動的な制御ができます。