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()
このスクリプトを実行すると、テキストが切り替わります。
Pythonの学習進め方
Pythonでできることは多岐に渡ります。
Pythonは強力で柔軟なプログラミング言語ですが、常に情報がアップデートされるので、
新しいライブラリやフレームワークを独学で学び続けることは困難です。
Udemyは動画で目的に応じた講座を受講できるのでレベルを合わせて学習できます。
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで独学できます。
Pythonでデータサイエンスや人工知能、GUIを学びたい人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を5つ紹介します。
ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)
Pythonをインストールから環境設定、基本文法が学習できる。さらに、モジュールの使い方やファイル操作の他に暗号化、並列化、インフラ自動化、キューイングシステム、非同期処理についても学べます。
Pythonの基礎を押さえつつ、人口知能やニューラルネットワーク、機械学習を取り扱う。機械学習ライブラリで文字認識や株価分析などを行う。
データサイエンティストになるために必要なツールについて学ぶことができる。統計分析、NumpyやPandasなどを使ったPythonのプログラミング、機械学習の実装、ディープラーニングの実装を学習できる。
PythonでGUIを作成する方法を取り扱う。Tkinterの発展的な操作まで学習できる。翻訳アプリ、家計簿アプリ、電卓アプリ、音楽再生アプリなど作成して、exeファイル化する。
イベント一覧
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メソッドを使用すれば、ユーザーインタラクション、カスタムイベント、
また特定の条件が満たされたとき実行する動的な制御ができます。