Python(tkinter007: ラベルへのイベント追加_bind)

■マウスやキー操作のイベントをラベルへ追加する。
今まで、クリックなどのイベントはボタンでしかできないと思っていたけど、調べる中でラベルにもイベント追加ができたので、そのサンプルを試してみた。試すイベントは次のもの。
・ カーソル合わせ
・ マウス右クリック
・ マウス左クリック
・ キー操作

何かするときは大体こんなところかな。
サンプルコードは下のもの。

import tkinter as ttk

ROW = 8
COLUMN = 8


class Function(ttk.Tk):

    def __init__(self):
        super().__init__()
        self.geometry("300x250")

        self.base_frame = ttk.Frame(self, pady=0, padx=0)
        self.base_frame.pack(side='top')

        self.bind_class("colorToBlack", "<Enter>", self.changeToBlack)
        self.bind_class("colorToWhite", "<Button-1>", self.changeToWhite)
        self.bind_class("colorToBlue", "<Button-3>", self.changeToBlue)
        self.bind_class("colorToRed", "<Key>", self.changeToRed)

        for i in range(0, COLUMN):
            for j in range(0, ROW):
                self.widgt1 = ttk.Label(self.base_frame, background="white", width=3, font=("Arial", 6))
                self.widgt1.grid(column=i, row=j, padx=1, pady=1)

                new_tags = self.widgt1.bindtags() + ("colorToBlack",) + ("colorToWhite",) + ("colorToBlue",) + (
                    "colorToRed",)
                self.widgt1.bindtags(new_tags)

    def changeToBlack(self, event):
        event.widget.configure(background="black")
        event.widget.focus_set()

    def changeToWhite(self, event):
        event.widget.configure(background="white")

    def changeToBlue(self, event):
        event.widget.configure(background="blue")

    def changeToRed(self, event):
        event.widget.configure(background="red")
        print(event.char)


if __name__ == "__main__":
    func1 = Function()
    func1.mainloop()

bind_classで、操作と関数を紐づけ。例えば、self.bind_class("colorToBlack", "<Enter>", self.changeToBlack)なら、カーソルが特定のウィジットに入ったら、changeToBlackの関数が発生する。その後で、どのウィジットにこの紐づけられたものを設定するかをbindtagsで設定。
このコードでは、8×8のラベルに対して、カーソルを合わせたとき(<Enter>)に背景色を黒、左クリックしたとき (<Button-1>)に白、右クリックしたとき(<Button-3>)に青、キー操作したとき(<Key>)に赤にする。
キー操作は、ラベルがフォーカスされている状態でなければならないので、カーソルを合わせるときにfocus_setでフォーカスがあった状態にする。あと、どのキーが押されたかコマンドプロンプト上に表示する。

動かしてみた画面が下のもの。

これを使えば、例えば前回のコードでも起動にボタンのウィジットを追加しなくても済むだろうし、スマートな感じの画面ができそう。