【Python】Tkinterのbindメソッドでイベント検出

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク

TkinterはPythonの標準ライブラリに含まれているGUI(グラフィカルユーザーインターフェース)ツールです。

Tkinterはシンプルで使いやすく、設定画面、ファイル選択ダイアログなど
小規模なアプリケーションを作成するのに適しています。

一方で、ボタンやテキストボックスなど簡易的なウィジェットばかりで
大規模なアプリを作成することにはあまり適していないです。

しかしbindメソッドを使用すれば、Tkinterウィンドウをキーボードのキーやマウスクリック、
カーソルを操作した時に処理をトリガーとして実行することができます。

本記事では、bindメソッドを使い方を紹介します。

本記事は次の人におすすめ
  • Pythonでデスクトップアプリケーションを作れるようになりたい
  • bindメソッドの使い方を知りたい
  • Pythonで画像トリミングする方法を知りたい
Udemyで学習する
スポンサーリンク

bindメソッド

Pythonにおけるbindメソッドは、
ウィジェットにイベントハンドラを関連付けるために使用されます。

イベントハンドラとは

特定のイベントが発生した時に実行するよう定められた処理のこと。
一般的にイベントを一対一に処理を結び付けたものをハンドラ、一つのイベントに対して複数の処理を結び付けたものをリスナという。

参考:「イベントハンドラ(イベントリスナ)とは

具体的にbindメソッドを使用すれば、ユーザーがボタンクリックやキーボード、マウスを操作した際にそれに応じた動作したり、カスタムイベントを作成してアクションを実行したりできます。

また、特定の条件が満たされたときにボタンを無効化、有効化にするような動的な制御ができます。

ユーザーインタラクション

ユーザーによる処理の例として、ボタンクリックをします。

ボタンクリックはdefで定義した処理をボタンのcommandに紐づけて実行する方法があります。

Tkinter Button(ボタン)の使い方と関数処理を解説しています。

上記の記事で紹介したスクリプトを参考にして、
ボタンを押すとターミナルに「アリッシアの朝」と表示するようにしました。

#クリックしたときに実行する関数
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は、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。




イベント一覧

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メソッドを使用すれば、ユーザーインタラクション、カスタムイベント、
また特定の条件が満たされたとき実行する動的な制御ができます。

Udemyで学習する
タイトルとURLをコピーしました