В прошлом я наблюдал, что некоторые оконные менеджеры временно крадут фокус у Tk при каждом нажатии кнопки, прежде чем вернуть его обратно;Я подозреваю, что это связано с тем, как работает обработка ключевых событий, но я не могу проверить в данный момент (из-за того, что на OSX, где вещи отличаются ).Из-за сложностей, связанных с этим, я бы предложил, чтобы, если вы связались с <FocusOut>
, вы также проверили, получите ли вы событие <FocusIn>
вскоре после этого;небольшая дополнительная задержка (например, 0,1 с) перед обновлением отключенного состояния кнопок не помешает.
Или вы можете повесить код, чтобы отключить механизм проверки виджетов ввода , возможно, вот так:
.e configure -validation focusout -validatecommand doButtonEnableDisable
Интерфейс проверки одинаков как для виджетов старого стиля entry
, так и для виджетов нового стиля ttk::entry
.Это также поддерживается спинбоксами.Просто знайте, что вам нужно вернуть логическое значение true из doButtonEnableDisable
, иначе вы отклоните изменение в записи, и вы должны позаботиться о том, чтобы ваш код не выдавал ошибку или он сам отключился;документы перечисляют вещи, на которые следует обратить внимание.