前提
ウィジェットのフォーカスをイベント後に次のウィジェットへ移動したい
↓のコードではリストにウィジェットを格納し、イベントハンドラにリストのインデックスを渡し
イベントの処理が発生した後に、次のリストインデックスのウィジェットにフォーカス
を当てようと思いましたが駄目でした。
イベント後に次(ウィジェット作成時に順番)のウィジェットへフォーカスを移す方法を
教えてください
該当のソースコード
import tkinter as tk class TopMenu: w_list = [] def focus_in_event(event,code): event.widget['bg'] = '#5CC7B2' #最後まで行ったら最初に戻る if code == 4: code = 0 else: code += 1 print(acc) TopMenu.w_list[code].focus_set() root = tk.Tk() root.title("test_a") root.geometry("670x400") for i in range(5): txt_a = tk.Entry(root) txt_a.pack() txt_a.bind("<FocusIn>", focus_in_event(i)) txt_a.bind("<FocusOut>", focus_out_event) w_list.append(txt_a) root.mainloop()
補足情報(FW/ツールのバージョンなど)
Python 3.10.5
Tkinter 8.6
よろしくお願いします。
実行できるコードを掲載してください。
focus_out_event が未定義です。
コードが期待通りに動作したとしても、
フォーカス In イベント内に次のフォーカスへ移動とすると
フォーカス In/Out イベントが永遠と呼ばれ続ける事になるので、
設問自体に無理があります。
やりたいことは、例えば、
フォーカスOut 時や Tab や Enter キーを押したときの
次の入力へのフォーカス移動ではありませんか?
すみません。変数(i)と(code)を消し忘れておりました
>>フォーカス In/Out イベントが永遠と呼ばれ続ける事になるので
今回のテストではIn/Outを永遠に続けるのが目的です。実際にはイベントのあるEntryの後にはイベントの無いEntryを設定する予定なのですが、
For分で作ったウィジェットのフォーカス移動手段を知りたかったため質問させていただきました
import tkinter as tk
class TopMenu:
w_list = []
def focus_in_event(event):
acc = 'abcdef'
event.widget['bg'] = '#5CC7B2'
event.widget.delete(0,tk.END)
event.widget.insert(tk.END, acc)
#TopMenu.w_list[???].focus_set() # ←ここで次のEntryにフォーカスを移せばよいのかと考えました
def focus_out_event(event):
event.widget['bg'] = '#FFFFFF'
root = tk.Tk()
root.title("test_a")
root.geometry("670x400")
for i in range(5):
txt_a = tk.Entry(root)
txt_a.pack()
txt_a.bind("<FocusIn>", focus_in_event)
txt_a.bind("<FocusOut>", focus_out_event)
w_list.append(txt_a)
root.mainloop()
>今回のテストではIn/Outを永遠に続けるのが目的です。
ここの認識に齟齬がありそうです。
「IN/Out が永遠に続けられる」というのは1回のイベントで
In/Out/In/Out が永遠と連続して発生し、
フォーカスが定まらない状態になってしまいます。(ウィンドウは応答なしになります)
1: FocusIn で 次の entry へフォーカスを移す
2: 次の entry の FocusIn が発生。focus_in_entry では次の entry へフォーカスを移す
3: 前の entry の FocusOut も発生
4. 次の次の entry の FocusInt が発生。。以下ループ
ちなみに、focus_out_event でフォーカスを移すと
Tab キーでの移動を阻害してしまうので、UIとして使い辛くなります。
ループ対策として、入力欄が空ならフォーカス移動をしないなどの対策が必要です。
利便性の為に次の入力欄へフォーカスを移すのではなく、
実験的にフォーカスが永遠と移動するアニメーションをやりたいという事でしょうか?
その場合は、また全然話が変わってきます。
回答2件
あなたの回答
tips
プレビュー