В TCL я не могу изменить фокус после первого focus
вызова
Вот MRE:
frame .f -padx 15 -pady 15
spinbox .f.spin1 -from 0 -to 10 -width 5 -relief solid -highlightthickness 1 -highlightcolor blue -borderwidth 1 -textvariable ::a
spinbox .f.spin2 -from 0 -to 10 -width 5 -relief solid -highlightthickness 1 -highlightcolor blue -borderwidth 1 -textvariable ::b
spinbox .f.spin3 -from 0 -to 10 -width 5 -relief solid -highlightthickness 1 -highlightcolor blue -borderwidth 1 -textvariable ::c
# note that changing the focus in the bindings works as expected
bind .f.spin1 <Key> { if {"%K" eq "Left"} { focus .f.spin3 } }
bind .f.spin1 <Key> {+ if {"%K" eq "Right"} { focus .f.spin2 } }
bind .f.spin2 <Key> { if {"%K" eq "Left"} { focus .f.spin1 } }
bind .f.spin2 <Key> {+ if {"%K" eq "Right"} { focus .f.spin3 } }
bind .f.spin3 <Key> { if {"%K" eq "Left"} { focus .f.spin2 } }
bind .f.spin3 <Key> {+ if {"%K" eq "Right"} { focus .f.spin1 } }
pack .f
grid .f.spin1 -column 1 -row 0
grid .f.spin2 -column 2 -row 0
grid .f.spin3 -column 3 -row 0
# with no focus invocation, no spinbox will be focused when the window opens
# we'll call focus on spin2 as default
# this works as expected
focus -force .f.spin2
# if some condition is met we want to change the focus to spin3
# but the following invocation doesn't change the focus
if { 1 } {
focus -force .f.spin3
}
Я также пытался (но безуспешно) фокусировка на кадре перед вращением 3
focus -force .f.spin2
focus -force .f
focus -force .f.spin3
Я попытался (снова безуспешно), используя after idle
after idle { focus -force .f.spin3 }
Что работало, использовало after 1000
, но это не элегантно с точки зрения кода. А также не очень хорошо для пользователя, так как он может напечатать до изменения фокуса. Я пробовал меньшие значения, но фокус не изменился бы для малых значений, так что это не надежное решение.
Почему это происходит? Как я могу это исправить?
edit: (не уверен, что актуально, но я на Win10)