【Tkinter】bindメソッドによるトリガーイベントとコールバック関数の紐づけ

【Tkinter】bindメソッドとeventオブジェクト

GUIアプリケーションではクリックやキー入力といったユーザーの操作(イベント)をトリガーにして何らかの処理(アクション)を行います。その紐づけを行うためにTkinterに用意されているのがbindメソッドです。

Buttonウィジェットなど一部のウィジェットにはcommandオプションが用意されているためそちらでイベントと処理の紐づけを行うことができますが、bindメソッドを使えば全てのウィジェットに対して処理の紐づけができます。

目次

bindメソッドの構文と引数

bindメソッドでイベントとそれに対する処理を記述したコールバック関数の紐づけを行うには次のように記述します。

ウィジェット名.bind(sequence=トリガーとなるイベント, func=コールバック関数名, add=値)

bindメソッドはこのように sequence、func、addの3つの引数を持っています。この引数に値を指定することでウィジェットに対してどのようなイベントが発生したときに、どの処理を実行するかを指定することができます。

イベントの指定(sequence)

トリガーとなる操作(イベント)を定義します。指定できるイベントタイプには次のようなものがあります。

イベントのタイプ イベント
Button, ButtonPress マウスのボタンが押された
ButtonRelease マウスのボタンが離された
Key, KeyPress キーが押された
KeyRelease キーが離された
Motion マウスの移動
Enter マウスカーソルがウィンドウの中に入った
Leave マウスカーソルがウィンドウから出た

sequenceの値は次のような構文で指定します。

<modifier-type-detail>

単に type を指定するだけでなく、 detail(マウスのどのボタンか、キーボードのどのキーか、といった特定のボタン)を指定したり、modifier(指定した type と同時に押すキー、CtrlやAltなど)を合わせて指定することができます。

イベント
<Button-1> または <1> マウスの左クリック
<Button-3> または <3> マウスの右クリック
<ButtonRelease-1> マウスの左ボタンを離した時
<ButtonRelease-3> マウスの右ボタンを離した時
<Return> キーボードのリターンキーが押された
<KeyPress-H> またはh キーボードのhキーが押された
<Control-c> Ctrlキーを押しながらキーボードのcキーが押された
<Shift-c> Shiftキーを押しながらキーボードのcキーが押された
<Alt-c> Altキーを押しながらキーボードのcキーが押された
<Double-1> マウスの左ボタンをダブルクリック

処理の指定(func)

イベントに対して実行される処理を記述したコールバック関数を指定します。

コールバック関数は次のように定義、指定します。

def 関数名(event):
    処理
ウィジェット名.bind("<1>", 関数名)

処理の追加(add)

同一のトリガーに対して追加のアクションを紐づけたい時はこのオプションを指定し値を”+”とします。

このオプションを付けずに追加のアクションを定義した場合は最初に紐づけたアクションが上書きされ、最後に定義したイベントのみが実行されます。

def 関数A(event):
    処理
def 関数B(event):
    処理
ウィジェット名.bind("<1>", 関数A)
ウィジェット名.bind("<1>", 関数B, "+")

イベント詳細情報の取得

Tkinterではイベントの詳細情報はイベントオブジェクト(event)のインスタンス変数にセットされてコールバック関数に渡されます。

渡される詳細情報には次のようなものがあります。

変数名
num マウスボタンの番号
x,y マウスカーソルの座標
time イベントの発生時刻
char キーに対応する文字
keysym キーに対応する名前

例えば次のコードはキーボードのいずれかのキーが押されたことをトリガーにして、押されたキーに対応する名前を表示します。

イベントの詳細情報がイベントオブジェクト(event)のインスタンス変数にセットされてprint_keysym関数に渡されれているため、ユーザーがどのキーを押したかが event.keysym で取得できるのです。

import tkinter as tk

 # tk.Frameを継承したApplicationクラスを作成
class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)

        # ウィンドウの設定
        self.master.title("ウィンドウのタイトル")
        self.master.geometry("300x200")

        # 実行内容
        self.pack()
        self.create_widget()

    # create_widgetメソッドを定義
    def create_widget(self):

        # ウィジェット変数を生成
        self.msg = tk.StringVar()
        self.msg.set("")

        # print_keysymメソッドを定義
        def print_keysym(event):
            self.keysym = event.keysym
            self.msg.set(self.keysym)

        # label1ウィジェットを作成
        self.label1 = tk.Label(self.master, text="あなたが押した\nキーは", font=("MSゴシック", "24", "bold"))
        self.label1.pack()

        # label2ウィジェットを作成
        self.label2 = tk.Label(self.master, textvariable=self.msg, font=("MSゴシック", "24", "bold"))
        self.label2.bind("<Any-KeyPress>", print_keysym)
        self.label2.pack()
        self.label2.focus_set()

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

このようにユーザーがキーを押すたびにそのキーに対応する文字が表示されます。

このエントリーをはてなブックマークに追加

【Tkinter】bindメソッドによるトリガーイベントとコールバック関数の紐づけ」への2件のフィードバック

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。