Невозможно изменить фокус после первого вызова - PullRequest
0 голосов
/ 27 февраля 2020

В 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)

1 Ответ

1 голос
/ 27 февраля 2020

Эта ошибка появляется также на Linux. Для этого я открыл билет .

Обход 1:

update
focus -force .f.spin3

Обход 2:

after 100 [list focus -force .f.spin3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...