Python(tkinter008: ラベルへのイベント追加_上下左右の移動)

■キーボードの上下左右でラベルを移動させる。
前回、ラベルのウィジットに対してキーボードの操作をイベントとして追加することができた。キーボードの上下左右のキーを押したときに、動くようなサンプルを組んでみる。考え方は下のような感じ。
・ラベルに対してフォーカスしている状態からキーボードの上下左右を押す。
・もとのラベルの名前と位置情報をDictionaryとして持っておき、フォーカスしているラベルの位置情報を取得する。
・キーに応じて位置情報を更新する。
・更新された位置情報からラベルの名前を取得する。
・もとのラベルの色を白にし、移動先のラベルを赤にする。

まず、print(event)で上キーを押した際のイベントの情報を確認した。

<KeyPress event state=0x40000 keysym=Up keycode=38 x=115 y=112>

keysymにUpとあるので、これが使えそう。keycodeも一意なものかもしれないけど、Upの方が分かりやすいのでこれを使う。x, yは、下や左右を押しても同じ値が出てくる。

キーのイベントを受けるメソッドが下のもの。

      def moveCells(self, event):
        print(event)
        orgLocation = int(self.keylabel_loc_dict.get(event.widget.winfo_name()))

        if event.keysym == 'Up':
            orgLocation = orgLocation - 1
        elif event.keysym == 'Down':
            orgLocation = orgLocation + 1
        elif event.keysym == 'Right':
            orgLocation = orgLocation + 100
        elif event.keysym == 'Left':
            orgLocation = orgLocation - 100

        print(str(orgLocation).zfill(4))
        movedLabel = self.keyloc_label_dict.get(str(orgLocation).zfill(4))
        print(movedLabel)
        self.base_frame.children[movedLabel].focus_set()
        self.base_frame.children[movedLabel].configure(background="red")
        event.widget.configure(background="white")

ここで、keylabel_loc_dict はラベルの名前をキー、位置情報を値としてもつDictionary。イベントが起きたときにフォーカスされているラベルの名前から位置情報を取得する。その後、Up, Down, Right, Leftで場合分けで位置情報を更新する。位置情報は0101のような文字列としており、3,4桁で左右、1,2桁で上下を示す。
更新した後の位置情報からラベルの名前を取得し、そこにフォーカス(focus_set)する。そして、フォーカス後のラベルとイベントが起こったときのラベル(もとのラベル)の色を変更する。

前にwinfo_idから直接ラベルの状態を変更できないか調べたけど、winfo_idではなくwinfo_nameで変えることができた。

8×8のラベルで試しており、それを超えるような操作をした場合、コンソールにはエラーが出るけど、tkinterの実行画面は止まることはなかった。