Резюме: Это немного неправильный дизайн, и это было место, где первоначальный вариант использования был неправильным, но мы не можем изменить его в 8. * (Я не уверен насчетTcl 9.0; мы все еще хотим избежать безвозмездных изменений там.)
Команда string is
изначально была разработана для поддержки параметров проверки виджета Tk entry
.Они позволяют виджету реагировать на ввод текста (или изменение фокуса), проверяя, было ли изменение в виджете в допустимом состоянии, например, удержание целого числа.Если вы хотите этого, вы просто сделаете это:
entry $w -validate key -vcmd {string is integer %P} -invcmd {bell}
Затем, если вы нажали буквенную клавишу, скажем A , с курсором в середине целого числа,Редактирование будет отклонено, и система выдаст предупреждающий шум.Действительно просто.
Есть только одна небольшая проблема.Если вы выбрали весь текст в записи и нажали цифру, редактирование также будет отклонено (если string is
было строго по умолчанию).Проблема заключается в том, что в редактировании имеется промежуточное переходное состояние, в котором старый текст удаляется, но перед вставкой нового текста: проверка происходит дважды в такой ситуации, один раз для delete
и один раз дляinsert
.(Это должно быть так из-за того, как вещи связаны друг с другом под капотом.) Это ужасный пользовательский опыт, поэтому string is
был сделан по умолчанию слабым, так что этовариант использования будет работать.
Это не решение, с которым я согласился - это должно было быть наоборот, если вам нужно было бы запросить слабость в тесте, если бы вы этого хотели, что привело бы к очень небольшим накладным расходам здесьпозволяя другим применениям быть более разумными - но в тот момент я был просто обычным пользователем.Я предпочитаю использовать многоэтапную проверку в моих формах, например, использование проверки уровня нажатия клавиш в качестве мягкой проверки, которая допускает неправильный ввод, когда пользователь находится на полпути через использование формы, и просто указывает, что он знает, что проблемы все равно существуют,с помощью таких методов, как настройка цветов фона и отключение кнопок отправки.(Но это не по теме для вашего вопроса ...)
Дизайн команды библиотеки сложен.Требуется тщательное рассмотрение вариантов использования, чтобы получить право.Иногда мы терпим неудачу.
Проблема возникла в коде, который был внешним по отношению к Tcl и Tk примерно во время Tcl 8.1.0. Большинство патча, представившего это, было очень хорошим (оно также давало нам такие команды, как string equal
и string map
), но это был аспект, который мог бы быть связан с немного большим приготовлением.