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の実行画面は止まることはなかった。